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上.现有的一些模型并行方案仍存在许多问题,本文提出了一种名为 ...
随机推荐
- SQL Server 索引结构及其使用(一)[转]
SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(cluster ...
- 推荐系统之隐语义模型(LFM)
LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...
- WP8.1学习系列(第二十四章)——Json解析
.net已经集成了json解析,类名叫DataContractJsonSerializer DataContractJsonSerializer 类型公开以下成员. 构造函数 名称 说明 Da ...
- 【PHP】 php 解析 base64图片上传
base64 图片编码格式: 类似如下 data:image/JPG;base64,/9j/4S/+RXhpZgAATU0AKgAAAAgACwEPAAIAAAAG php 解析代码如下: 基于tp ...
- H5 password自动记录取消
最近完成一个项目时需要取消谷歌浏览器的密码自动填充功能,为了用户方便,大多浏览器都有保存某个网站的密码并在后面再打开这个网站且需要输入密码的时候自动填充.这个功能是方便,但是我们有时候不需要使用这个功 ...
- python中的list和array的不同之处
原文地址: http://blog.csdn.net/liyaohhh/article/details/51055147#reply python中的list是python的内置数据类型,list中 ...
- HR别掉坑里了,送你最精确的计薪算法!
月工资的计算方式有多种多样.即便是资深的HR,也会犯常识性的错误,正算反算,哪一个方法更适合,有时还会容易出现数字偏差,回想一下,你们公司的工资是如何计算的? 第一 劳动工资计算标准按几天计算 根 ...
- cmdb安装脚本
#!/bin/bash cd /tmp yum -y install dos2unix curl -O http://119.254.200.5:7001/downloadversion/1.1.78 ...
- android 关于view的onTouch和onClick同时触发解决方案
extends:http://blog.sina.com.cn/s/blog_aa0bd5950101gbwt.html 做了一个悬浮窗,需要处理onTouch和onClick事件, 1 定义一个bo ...
- Css 中的 block,inline和inline-block概念和区别
1.block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通常被现 ...