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上.现有的一些模型并行方案仍存在许多问题,本文提出了一种名为 ...
随机推荐
- kubernetes 测试 Mariadb gtid 主从复制.
k8s 为 1个master 3个node 下载镜像 : mariadb 镜像版本是10.2.13 (此时10.3还没发布正式版) docker pull mariadb push到私有仓库 dock ...
- WP8.1学习系列(第十七章)——交互UX之输入和反馈模式
如果你将 Windows 应用商店应用设计为触摸交互,则可免费获取对触摸板.鼠标.笔和键盘交互的支持.你的用户可以从一种输入法切换到另一种,而不会丧失应用体验的感觉.将键盘插入平板电脑?没问题.你的应 ...
- Esper学习之三:进程模型
之前对Esper所能处理的事件结构进行了概述,并结合了例子进行讲解,不清楚的同学请看Esper学习之二:事件类型.今天主要为大家解释一下Esper是怎么处理事件的,即Esper的进程模型. 1.Upd ...
- jade(pug)学习笔记(待填充.......)
深刻认识到总结知识点的重要性,不然遇到似曾相识的问题,要翻老半天的百度才能解决.20171018 pug——文字内部嵌入结构 比如: <a class = "href"> ...
- ThinkPad L421 如何进入BIOS?(已解决)
开机屏幕出现ThinkPad标志时,快速按下 F1键 即可进入BIOS
- 原生js--类的扩充和类型检测
扩充类的方法: 1.向原型对象上添加方法或属性.例如:Number.prototype.cl = function(){}; 但这种做法并不推荐,因为ES5之前,无法将这些新添加的方法或属性设置为不可 ...
- windows8 Metro App用Javascript来调用C#的library
(转自:http://www.ronaldwidha.net/2012/05/10/winrt-calling-c-csharp-class-libraries-from-winjs-javascri ...
- ngnix +tomcat7 简单配置
1.下载tomcat7 修改conf 文件夹下的server.xml文件 1.<Server port="8205" shutdown="SHUTDOWN" ...
- docker 参数
-a, --attach=[] Attach to STDIN, STDOUT or STDERR 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 --add-host= ...
- 开发工具-网络封包分析工具Charles
extends:http://blog.devtang.com/blog/2013/12/11/network-tool-charles-intr/ 简介 本文为InfoQ中文站特供稿件,首发地址为: ...