dp训练
根据这位大佬的https://www.cnblogs.com/Bunnycxk/p/7360183.html
题目链接;https://www.luogu.org/problemnew/show/P3399
题目描述
小仓鼠带着货物,从中国送到安息,丝绸之路包括起点和终点一共有N+1个城市,0号城市是起点长安,N号城市是终点巴格达。要求不超过M天内必须到达终点。一天的时间可以从一个城市到连续的下一个城市。从i-1城市到i城市距离是Di。
大家都知道,连续赶路是很辛苦的,所以小仓鼠可以在一个城市时,可以有以下选择:
移动:向下一个城市进发
休息:呆在原来的城市不动
沙漠天气变化无常,在天气很不好时,前进会遇到很多困难。我们把M天的第j(1<=j<=M)天的气候恶劣值记为Cj。从i-1城市移动到i城市在第j天进发时,需要耗费Di*Cj的疲劳度。
不过小仓鼠还是有选择权的,可以避开比较恶劣的天气,休息是不会消耗疲劳值的。现在他想知道整个行程最少要消耗多少疲劳值。
输入输出格式
输入格式:
第一行2个整数N,M
连续N行每行一个整数Dj
连续M行每行一个整数Cj
输出格式:
一个整数,表示最小疲劳度
输入输出样例
3 5
10
25
15
50
30
15
40
30
1125
#include <stdio.h>
#include<iostream>
#include <string.h>
#include <vector>
using namespace std;
#define N 1000
vector<int> d;
vector<int> c;
int f[N][N];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int temp;
d.push_back();
c.push_back();//因为后边需要的是从下标1开始
for(int i=;i<n;i++){
scanf("%d",&temp);
d.push_back(temp);
}
for(int j=;j<m;j++){
scanf("%d",&temp);
c.push_back(temp);
}//读入。
//初始化,一天都不歇,
//f[1][0]=0; for(int i=;i<=n;i++)
f[][i]=;
// f[1][1]=d[0]*c[0];
// for(int i=2;i<=n;i++){
// f[i][i]=f[i-1][i-1]+d[i]*c[i];
// }
// int j=0;//从第0天开始
// for(int i=1;i<=n;i++){
// if(f[i][j-1]>f[i-1][j-1]+d[i]*c[j]){
// f[i][j]=f[i-1][j-1]+d[i]*c[j];
// j++;
// }else{
// f[i][j]=f[i][j-1];//也就是说第j天,依旧是在i城市,
// }不能这样初始化,因为每一个是和之前的相关的
// }
for(int i=;i<=n;i++){
f[i][i]=f[i-][i-]+c[i]*d[i];//如果一直走;第i天,到了i城市。
for(int j=i+;j<=m;j++){//如果延迟了
f[i][j]=min(f[i][j-],f[i-][j-]+c[j]*d[i]);
}
}//f[i][..]是就算当前是乘以最后一天m疲惫值最小,那也需要结合f[i+1][..]天的情况决定到底是选f[i][几]的。
//也就是说 从这f[i][..]里选择一个更小的。
printf("%d",f[n][m]);
}//两个疑问,
//一个是完全就不用走所花匹配值最小。。第二如果天数不够用是怎么控制的?
return ;
}
//动态二维dp,关键还是状态函数,感觉有点难理解。经常复习一下吧
2.在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。密码就是最长词链所包括的单词数。
输入输出样例
5
i
int
integer
intern
internet
4
//看见这个就完全看不懂的感觉。就想到暴力破解,循环,
#include<iostream>
#include<string>
using namespace std;
string s[];
int wz[],n;
int main()
{
cin>>n;
for(int i=;i<=n;i++) {
cin>>s[i];
wz[i]=;
for(int j=i-;j>=;j--)
if(s[i].find(s[j])==)//起始位置是否为0
wz[i]=(wz[j]+)>wz[i]?(wz[j]+):wz[i];
wz[]=wz[i]>wz[]?wz[i]:wz[];//顺便用它来保存
}
cout<<wz[];
return ;
}
//真的是很神奇,直接用find就可以了,输入一个那么就find之前的所有数,是否是返回0,即从0位置开始,厉害。来自题解,链接:https://www.luogu.org/problemnew/solution/P1481
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=;
struct edge
{
int link[];//每个都有26个字母
int s;//以当前字母结尾的串的个数
} t[MAXN];
int n,m,cnt;
int ans;
void zbr(char *c)//建立字典树的过程。
{
int ansm=;
int p=;
int i;
int len=strlen(c);
for(int i=; i<len; i++)
{
int zz=c[i]-'a'+;
if(t[p].link[zz]==)
t[p].link[zz]=++cnt;//cnt表示的是下标,即t数组中,用到第几个了。
p=t[p].link[zz];
ansm+=t[p].s;
} if(ansm>=ans)
ans=ansm+;
t[p].s++;//在结尾的时候才++
}
int main()
{
int i;
char c[]="";
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%s",c);
zbr(c);
}
printf("%d\n",ans);
return ;
}
//这个是用字典树写的,不太理解什么意思。
南大2018夏令营机试dp
转自:https://mp.weixin.qq.com/s/WLRXLdi-3igkjtiWlHg7Ug
1. Count number of binary strings without consecutive 1's
Given a positive integer n(3≤n≤90), count all possible distinct binary strings of length n such that there are no consecutive 1's .
Examples:
Input: 2
Output: 3 // The 3 strings are 00, 01, 10 Input: 3
Output: 5 // The 5 strings are 000, 001, 010, 100, 101
主要思想:令a[i]为长度为i的不含连续1的二进制串的个数,考虑长度为i的不含连续1的任意一个二进制串:若第i位(末位)为0,则第i-1位可以为0也可以为1,这种情况的二进制串有a[i-1]个;若第i位为1,则第i-1位只能为0(否则最后两位为连续两个1,不符题意),进一步考虑第i-2位,由第i-1位为0可知第i-2位可以为0也可以为1,这种情况的二进制串有a[i-2]个。综上可以写出递推式 a[i]=a[i-1]+a[i-2], i≥3,边界条件为a[1]=1,a[2]=3。本题动态规划的时间复杂度为O(n)。
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
long long *a = new long long[n+]{,,};
for(int i=;i<=n;i++) {
a[i]=a[i-]+a[i-];
}
cout<<a[n]<<endl;
return ;
}
//看完之后就觉得太厉害了!学习了!还需要不断学习!
dp训练的更多相关文章
- 20220729 - DP训练 #2
20220729 - DP训练 #2 时间记录 \(8:00-8:10\) 浏览题面 \(8:10-8:50\) T1 看题想到了建树,从每一个点遍历,若能遍历每一个点,则可以获胜 快速写完之后,发现 ...
- 20220728 - DP训练 #1
20220728 - DP训练 #1 时间记录 \(8:00-9:00\) T1 尝试做 \(T1\),可惜并未做出,没有想到是资源分配 设置三维状态,初值一直不知道怎么设置 并且对于距离有一部分不会 ...
- 8.8&8.9 dp训练小结
写了两天的dp题,表示大多dp都不会啊,还是爆搜大法好.我真的太蒻了dp还是要多做题啊,一些基本的套路还是不熟,真正写对的dp也就一道,还一道爆搜过的,dp还有很深的坑要填啊.. 8.8 T1 质数和 ...
- 区间DP训练
一.石子合并 问题描述 将 n (\(1 \le n \le 200\))堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并 ...
- Column Addition~DP(脑子抽了,当时没有想到)
Description A multi-digit column addition is a formula on adding two integers written like this:
- hdu2089数位DP
旁听途说这个名字很久了,了解了一下. 改题目的意思是给你若干区间,让你找寻区间内不含62或4的数. 首先暴力必然T...那么实际上就是说,想办法做一种预处理,在每次输入的时候取值运算就可以了. 既然是 ...
- 初学dp心得
从STL到贪心,再到现在的动态规划,可以说动态规划真的让我学的有点蒙,对于一些题目,会做,但是不会用DP,现在还不能熟练的写出状态转移方程,更重要的是,自己宛如一个哺乳期的小孩,做题需要套模板,没有模 ...
- dp (1)
D - Tree of Tree ZOJ - 3201 这个题目我开始是这么定义的dp[i][j][0] dp[i][j][1] 表示对于第i个节点还有j个的选择 0 代表不选这个节点,1 代表选这个 ...
- ML2021 | (腾讯)PatrickStar:通过基于块的内存管理实现预训练模型的并行训练
前言 目前比较常见的并行训练是数据并行,这是基于模型能够在一个GPU上存储的前提,而当这个前提无法满足时,则需要将模型放在多个GPU上.现有的一些模型并行方案仍存在许多问题,本文提出了一种名为 ...
随机推荐
- WP8.1学习系列(第九章)——透视Pivot开发指南
Windows Phone 8 的 Pivot 控件 2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows P ...
- 百度编辑器(UEditor)自定义工具栏
百度编辑器(UEditor)自定义工具栏的自定义 百度编辑器默认功能比较齐全,但是不一定是我们所需要的,有的功能可以去掉,用自己想要的就可以了,可以参考百度官方文档! 百度编辑器默认配置展示界面 如何 ...
- SharpGL学习笔记(十一) 光源创建的综合例子:光源参数可调节的测试场景
灯光的测试例子:光源参数可以调节的测试场景 先看一下测试场景和效果. 场景中可以切换视图, 以方便观察三维体和灯光的位置.环境光,漫射光,镜面反射光都可以在四种颜色间切换. 灯光位置和摄像机位置(Lo ...
- mariadb修改root密码的方法
mariadb安装好后,root密码为空,可以先使用HeidiSQL链接到数据库,执行以下sql,就可以修改root的密码了 update mysql.user set password=passwo ...
- openstack-networking-neutron(三)---用户态和内核态的区别
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
- [原]sublime Text2
sublime Text2 升级到 2.0.2 build 2221 64位 的破破解 sublime Text2 download website 链接: http://pan.baidu.com/ ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
实验十四比起动手笔者更加注重原理,因为实验十四要讨论的东西,不是其它而是低级建模II之一的模块类,即储存模块.接触顺序语言之际,“储存”不禁让人联想到变量或者数组,结果它们好比数据的暂存空间. . i ...
- Javascript-Object-Definition
/* 定义对象的方法:构造函数,函数字面量法,工厂模式,构造函数模式 */ /**************************************/ /** **/ /** 1.原生构造函数法 ...
- 编程(Linux、windows)常见命令
1.history | grep start 可以查看该linux上输入过的包含start的所有命令 2. for /r %i in (*.lastUpdated) do del %i 在windo ...
- html 在一个超链接上面,鼠标移动上去时,也显示一串文字,如何实现
a标签的title属性,对title属性赋值即可.例如:<a href="http://www.baidu.com/" title="跳转到百度"> ...