
动态规划
NotFound1
这个作者很懒,什么都没留下…
展开
-
|BZOJ 1652|区间DP|[Usaco2006 Feb]Treats for the Cows
BZOJ 1652 Luogu 2858 from: USACO 2006 Feb Sliver(USACO刷题第5题)显然DP。 设f[i][j]f[i][j]为左取ii个,右取jj个的最大值 初值: f[x][0]=∑i=1xvi[i]∗if[x][0] = \sum_{i=1}^{x}vi[i]*i f[0][x]=∑i=nxvi[i]∗(i−n+1)f[0][x] = \sum_原创 2017-06-12 19:12:14 · 377 阅读 · 0 评论 -
|洛谷|动态规划|P2690 接苹果
https://www.luogu.org/problem/show?pid=2690比较简单的DP,但我还是交了3次才AC,能力仍然不足啊#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);/* NOIP2016倒计时,RP++ Luogu: P2690 接苹果 设f[i][j]原创 2016-11-06 22:31:32 · 805 阅读 · 0 评论 -
|洛谷|动态规划|P1359 租用游艇
https://www.luogu.org/problem/show?pid=1359挺简单的一道区间DP,注意半矩阵的读入#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);/* NOIP2016倒计时,RP++ Luogu: P1359 租用游艇 设f[i]为到达第i个出租站的最小原创 2016-11-05 22:54:35 · 851 阅读 · 0 评论 -
|洛谷|动态规划|P1115 最大子段和
http://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P1115动态规划思想,这里可以免去数组。#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);using namespace std;int main(){ int n;原创 2016-09-18 21:48:32 · 419 阅读 · 0 评论 -
|Vijos|动态规划|P1057 盖房子
https://vijos.org/p/1057设f[i][j]为以i,j为正方形右下顶点的最大边长不难得出初始值 f[i][j] = a[i][j] ,a为输入数组则有状态转移方程 f[i][j] = min(f[i-1][j], f[i-1][j-1], f[i][j-1]);因为f[i][j]只能从这些点得出 #include#include#include#i原创 2016-08-27 10:09:17 · 645 阅读 · 0 评论 -
|Vijos|NOIP2005|动态规划|P1002 过河
https://vijos.org/p/1002dp转移方程比较简单,不过需要优化数组开滚动数组,否则10^9数组。。然后就是离散化,如果连续t个值都相同,那么就跳到下一个石头位置-tPS:f数组初始化开大一点。。我提交五六次结果是这个问题。。#include#include#include#include#include#define ms(i,j) memset(原创 2016-08-26 22:00:55 · 613 阅读 · 0 评论 -
|Tyvj|动态规划|1023 奶牛的锻炼
http://tyvj.cn/p/1023比较简单的区间DP,注意如果要休息,那就必须得一直休息到疲劳值为0,则f[i][0]可以从f[i-k][k]转移而来ps: 由于Tyvj现在503,代码取不下来,等好了以后再补原创 2016-09-03 22:32:09 · 801 阅读 · 0 评论 -
|NOIOJ|动态规划|8462:大盗阿福
http://noi.openjudge.cn/ch0206/8462/f[i] = max(f[i-1], f[i-2]+a[i])f[i-1]表示不抢这家店,f[i-2]+a[i]表示抢这家店#include #include #include #define ms(i,j) memset(i, j, sizeof(i));typedef long long ll;usi原创 2016-09-04 17:08:37 · 1116 阅读 · 0 评论 -
|NOIOJ|动态规划|6045:开餐馆
http://noi.openjudge.cn/ch0206/6045/较简单的DP设f[i]为前面i家餐馆的最大利润,初始化f[i]=p[i], f[0] = 0转移的话,有不选这家餐馆和选这家餐馆两种选择,然后注意找到一个最近且m[i]-m[j]>k的餐馆就可以break了#include#include#include#define ms(i,j) memset(i,原创 2016-09-02 22:03:16 · 910 阅读 · 0 评论 -
|洛谷|动态规划|P1736 创意吃鱼法
http://www.luogu.org/problem/show?pid=1736先O(nm)预处理r, l, up数组分别代表在右边连续出现几个0,在左边连续出现几个0,在上边连续出现几个0即得转移方程,f[i][j]为以i,j作为正方形的右下顶点的最大吃鱼数主对角线:f[i][j]=min(f[i-1][j-1],left[i][j-1],up[i-1][j])+1副对角原创 2016-09-30 19:09:22 · 589 阅读 · 0 评论 -
|洛谷|NOIP2010|动态规划|P1541 乌龟棋
http://www.luogu.org/problem/show?pid=1541设f[i][j][k][l]为四种卡片的使用次数,则不难得出状态转移方程f[i,j,k,l]=max{[i-1,j,k,l],f[i,j-1,k,l],f[i,j,k-1,l],f[i,j,k,l-1]}+s[i*1+j*2+k*3+l*4];#include#include#include#原创 2016-09-30 20:58:40 · 452 阅读 · 0 评论 -
|洛谷|NOIP2006|动态规划|P1063 能量项链
http://www.luogu.org/problem/show?pid=1063类似于合并石子,只不过这里是环形的,只需要把a数组复制一遍,然后对[1..2n]区间进行DP,注意要逆推,答案是max{[1..n], [2..n+1], [3..n+2]....[n,n+n-1]}#include#include#include#include#define ms(i,j) me原创 2016-10-02 14:37:16 · 490 阅读 · 0 评论 -
|BZOJ 1633|字符串DP|[Usaco2007 Feb]The Cow Lexicon 牛的词典
BZOJ 1633 Luogu 2875 from: USACO 2007 Jan Sliver(USACO刷题第13题)刚开始根本没想到DP,什么kmp,AC自动机,后缀数组都想了。。看了题解才知道 解决字符串的几大武器:(字符串DP,字符串Hash,KMP,AC自动机,后缀家族……)本题设f[i]f[i]为给定串前ii个字符进行处理后最少删除的字符数。 刚开始想了个超时的方法。。然后发现原创 2017-06-17 17:17:11 · 656 阅读 · 0 评论 -
|Hdu 3336|KMP|动态规划|Count the string
poj传送门 如果next[j]=inext[j] = i, 那么说明[0,i−1][0, i-1]与[j−i,j−1][j-i, j-1]部分相同 并且i,ji,j之间没有更多的前缀 设dp[i]dp[i]为前ii个字符中前缀出现次数 dp[i]=dp[next[i]]+1dp[i] = dp[next[i]]+1 /* hdu 3336 KMP+D原创 2017-04-09 15:52:18 · 556 阅读 · 0 评论 -
|洛谷|递推|P1025 数的划分
http://www.luogu.org/problem/show?pid=1025设F(i,j)为用j个数组成i,答案为F(7,3)的话。一个思路是,对于F(7,3)=不含1的方案数①+含1的方案数②。F(i,j)=a(i,j)+b(i,j)子问题①a(i,j)=F(i-j,j),如其中一个方案2 2 3不含1,则把组成它的j个数都减去1,变成1 1 2的方案转载 2016-09-23 22:40:13 · 665 阅读 · 0 评论 -
|题目分类|动态规划
动态规划前i个物品所用重量为j的最优值1. 数字三角形http://blog.youkuaiyun.com/darost/article/details/520849422. 机器分配http://blog.youkuaiyun.com/darost/article/details/520915973. 乘积最大(NOIP2000) http://blog.csdn.ne原创 2016-12-03 20:00:32 · 426 阅读 · 0 评论 -
|洛谷|动态规划|P1130 红牌
https://www.luogu.org/problem/show?pid=1130比较简单的DP,注意不能往i-1的方向换#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);/* NOIP2016倒计时,RP++ Luogu: P1130 红牌*/using namespace s原创 2016-11-13 12:01:23 · 654 阅读 · 0 评论 -
|洛谷|动态规划|P1968 美元汇率
https://www.luogu.org/problem/show?pid=1968设f[i][0]为换美元,f[i][1]为换马克,易得出状态转移方程。#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);/* NOIP2016倒计时,RP++ Luogu: P1968 美元汇率*/原创 2016-11-08 22:06:52 · 852 阅读 · 0 评论 -
|洛谷|NOIP2007|动态规划|P1095 守望者的逃离
http://www.luogu.org/problem/show?pid=1095第一次循环让守望者只能闪烁,然后第二次循环让守望者只能跑步,比较两次的长短即可#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);using namespace std;int f[300005];int原创 2016-10-03 23:10:30 · 603 阅读 · 0 评论 -
|洛谷|动态规划|P1156 垃圾陷阱
http://www.luogu.org/problem/show?pid=1156用布尔数组f[i][j]表示高度为i时体力值为j时的状态存在然后DP即可#include#include#include#include#define ms(i,j) memset(i,j, sizeof i);using namespace std;struct ab{ int t;原创 2016-10-03 11:11:29 · 818 阅读 · 0 评论 -
|Vijos|NOIP2002|动态规划|P1121 马拦过河卒
https://vijos.org/p/1121实际上这题其实是递推。。到一个点的路径条数为它左边和上面的点的路径和#include#include#include#define ms(i,j) memset(i, j, sizeof(i));#define pa2(a,x,y) for (int i=0;i<=x;i++){ for (int j=0;j<=y;j++) if原创 2016-08-24 13:02:47 · 425 阅读 · 0 评论 -
|洛谷|动态规划|P1282 多米诺骨牌
http://www.luogu.org/problem/show?pid=1282设f[i][j]为前i个骨牌差值为j的最小翻牌次数初始值全部赋值为∞,然后f[1][a[1]-b[1]]=0, f[1][b[1]-a[i]]=1;对应于第一张牌不翻和翻状态转移方程:f[i][j] = min(f[i-1][j-(a[i]-b[i])], f[i-1][j-(b[i]-a[i])]原创 2016-09-12 21:50:51 · 2683 阅读 · 0 评论 -
|Tyvj|动态规划|P1071 LCIS
http://tyvj.cn/p/1071LCIS经典问题,具体看这个http://blog.youkuaiyun.com/Darost/article/details/52354660#include#include#include#define ms(i,j) memset(i, j, sizeof i);using namespace std;int n;int a[3005原创 2016-09-01 21:29:54 · 768 阅读 · 0 评论 -
|Tyvj|动态规划|P1004 滑雪
http://tyvj.cn/p/1004由于考虑高度问题,确保每个值都算出来,这里用的是记忆化搜索。#include#include#includeusing namespace std;const int dx[4] = {1,0,-1,0};const int dy[4] = {0,1,0,-1};const int maxrc = 100 + 5;int r,c;i原创 2016-08-06 11:15:43 · 547 阅读 · 0 评论 -
|Tyvj|NOIP2000|动态规划|P1884 方格取数
http://tyvj.cn/p/1884#include#include#includeusing namespace std;const int maxn = 51;int f[maxn][maxn][maxn][maxn];//设f[i][j][h][k]为第一条路径到达map[i][j], 第二条路径到达map[h][k]时的最优值/* f[i][j][h][k原创 2016-08-05 23:24:30 · 495 阅读 · 0 评论 -
|Tyvj|NOI1995|动态规划|P1055 沙子合并
http://tyvj.cn/p/1055#include#include#includeusing namespace std; const int maxn = 1000 + 5; int f[maxn][maxn]; //设f[i][j]为合并[i..j]的最小费用 //f[i][j] = min{f[i][j], f[i][k]+f[k+1][j]+a[j]-a[i-1]原创 2016-08-05 15:29:55 · 1222 阅读 · 1 评论 -
|Tyvj|动态规划|P1203 机器分配
http://tyvj.cn/p/1203dp题,设f[i][j]为前i个公司分配j个机器的最大盈利,设v为第I个公司分配J台机器的盈利 则f[i][j] = max{f[i-1][k]+v[i][j-k]} 答案是max{f[n][j]} 注意机器不一定要全部分完m个!#include#include#includeusing namespace st原创 2016-08-02 10:02:35 · 382 阅读 · 0 评论 -
|Tyvj|NOIP2004|动态规划|P1067 合唱队形
http://tyvj.cn/p/1067dp题, 从左往右做一次求最长上升子序列存在pre数组 从右往左做一次求最长上升子序列存在post数组 注意是最长上升子序列不是最长不下降子序列! 最长上升子序列是 t1 最长不下降子序列是 t1然后枚举中间那个人Ti,最多存留人数是max{pre[ti]+post[ti]},最后 n原创 2016-08-01 19:04:54 · 436 阅读 · 0 评论 -
|Tyvj|NOIP1999|动态规划|贪心|P1878 拦截导弹
http://tyvj.cn/p/1878第一问:最长不上升子序列dp第二问:贪心#include#include#includeusing namespace std;int main () { const int maxn = 100 + 5; int dd[maxn]; int n=0; int yyy; while (scanf原创 2016-08-01 15:42:49 · 1223 阅读 · 0 评论 -
|Tyvj|NOIP2013|动态规划|P3074 小朋友的数字
http://tyvj.cn/p/3074真坑的题目。。核心是求最大子段和,DP搞定“其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。”原来前面可以分别找出两个小朋友,一个特征值的最大,一个分数最大最后两个点还超long long。。加了取模又莫名WA两个点。。然后弄了个特判,AC了。。#include#include#i原创 2016-08-16 18:12:37 · 690 阅读 · 0 评论 -
|Tyvj|动态规划|P3573 求最长不下降序列
经典dp问题,求最长不下降序列要注意序列可能出现等于,第一次WA就是这个原因#include#include#includeusing namespace std;int main () { const int maxn = 10000+5; int a[maxn]; int n; scanf("%d", &n); for (int i=1;i<=n;原创 2016-08-01 15:05:27 · 389 阅读 · 0 评论 -
|Tyvj|动态规划|P1102 单词的划分
http://tyvj.cn/p/1102字符串dp。感觉C++对字符串处理不是很友好..做字符串的题目一定要专心!#include#include#includeusing namespace std;const int maxan = 100 + 5;char a[maxan];int la;char s[maxan][maxan];int l[maxan];原创 2016-08-06 17:34:17 · 888 阅读 · 0 评论 -
|Tyvj|NOIP2000|动态规划|P1047 乘积最大
http://tyvj.cn/p/1047PS:此题可以不用高精度AC(数据水)#include#include#includeusing namespace std;const int maxn = 40 + 5, maxk = 5 + 5;long long s;long long a[maxn][maxn]; long long f[maxk][maxn];//设f[原创 2016-08-05 18:14:30 · 362 阅读 · 0 评论 -
|Vijos|动态规划|P1111 小胖的水果
https://vijos.org/p/1111LCS,(两个字符串的总长度 - 两个字符串求得的LCS)即为答案, 注意输入的字符是0开始的,而dp里0-1会越界错误,输入时不要把输入的字符指针指向a,而是指向a+1#include#include #include #include #define ms(i,j) memset(i, j, sizeof(i)); usi原创 2016-08-28 16:38:51 · 528 阅读 · 0 评论 -
|洛谷|动态规划|P1108 低价购买
http://www.luogu.org/problem/show?pid=1108第一问就是最长下降子序列,第二行是下降子序列的个数(不能相同)当前i加上前面的方案数当且仅当相同的数只加最后一个用ok[j]表示价格为j的股票已经加过,逆推可以保证上面的条件#include#include#include#include#define ms(i,j) memset(i, j原创 2016-09-12 21:00:01 · 455 阅读 · 0 评论 -
|NOIOJ|动态规划|9267:核电站
http://noi.openjudge.cn/ch0206/9267/设f[i][j]为前i个坑现在已经连续埋了j个核燃料的方案,f[1][0] = 1; f[1][1] = 1;#include#include#include#define ms(i,j) memset(i,j, sizeof i);using namespace std;int n,m;long long原创 2016-09-10 20:56:07 · 737 阅读 · 1 评论 -
|NOIOJ|动态规划|9268:酒鬼
http://noi.openjudge.cn/ch0206/9268/ 思路同核电站一题,只是这里不是求方案数,一样的#include#include#include#define ms(i,j) memset(i,j, sizeof i);using namespace std;int a[705];int f[705][5];int main(){ int n原创 2016-09-10 20:58:40 · 539 阅读 · 0 评论 -
|NOIOJ|动态规划|3532:最大上升子序列和
http://noi.openjudge.cn/ch0206/3532/改一下最长上升子序列的程序就行了,f[i]记录以i结尾的最大上升子序列和#include#include #include #include #define ms(i,j) memset(i, j, sizeof(i)); using namespace std;int n;int a[1005];原创 2016-08-29 22:54:39 · 495 阅读 · 0 评论 -
|NOIOJ|动态规划|2988:计算字符串距离
http://noi.openjudge.cn/ch0206/2988/折腾了我很久,终于会了。。设a数组为第一个字符串,b数组为第二个字符串,数组从下标1开始对于这个问题,我们设f[i][j]为ai到bj的字符串距离(ai为a[1~i], bi为b[1~j])设a数组的长度为m,b数组的长度为n初始:f[i][0] = i; (1当b数组为空时,a数组到b数组原创 2016-08-29 18:04:14 · 936 阅读 · 0 评论 -
|Vijos|动态规划|P1264 神秘的咒语
https://vijos.org/p/1264LCIS,也就是最长上升公共子序列用dp[I][j]表示a[1..i]和b[1..j]的最长上升公共子序列,并以b[j]结尾dp[I][j] = max(dp[I-1][j], max(dp[I-1][k]+1 | k不理解的强烈建议自己模拟一次样例15 1 4 2 5 -124 -12 1 2 4k可原创 2016-08-29 16:53:12 · 1108 阅读 · 0 评论