动态规划 DP
turbo_7
无聊等于慢性自杀
展开
-
poj2181 hdu2713 Jumping Cows
#include#includeusing namespace std;int n,a,f[150005][2];int main(){ int i,j; while(scanf("%d",&n)!=EOF){ memset(f,0,sizeof(f)); scanf("%d",&f[1][1]); for(i=2;i<=n;i++){ scanf("%d",&a);原创 2013-05-01 15:12:24 · 423 阅读 · 0 评论 -
hdu3555 Bomb 数位DP
数位DP初学者,代码就是网上千篇一律,相似度极高的数位DP代码一个不错的题解http://www.cnblogs.com/luyi0619/archive/2011/04/29/2033117.html#include#include#include#define llong long longusing namespace std;llong dp[20][3];int原创 2013-06-03 22:35:34 · 537 阅读 · 0 评论 -
hdu2844 Coins
在discuss里看到的这个方法,不需要二进制优化,也不需要单调队列优化,仅需增加一个数组记录每个coin使用的个数,既好写有好理解,话说那个高端大气的单调队列优化各种复杂抽象难以理解,膜拜ing。#include#include#includeusing namespace std;int n,m;int a[105],c[105],used[100010];bool f[1原创 2013-06-07 10:42:44 · 533 阅读 · 0 评论 -
poj2576 tug of war
二维费用背包,不能使用滚动数组!#include#include#include#define max(x,y) (x>y?x:y)using namespace std;int f[51][23000],a[101];int main(){ int n,i,j,k; scanf("%d",&n); int side=(n+1)/2,sum=0; for(i=1;i<=n;i+原创 2013-05-19 16:22:25 · 738 阅读 · 0 评论 -
2012省赛热身题 Climbing Stairs
#include#include#includeusing namespace std;int f[105][105],a[105];int main(){ int t,icase=1; int n,k; int i,j; scanf("%d",&t); while(t--){ memset(f,0,sizeof(f)); scanf("%d%d",&n,&k);原创 2013-05-05 22:52:40 · 539 阅读 · 0 评论 -
hdu2078
看完题就往类背包DP上想了,看了discuss才意识到这题根本没那么麻烦#include#includeusing namespace std;int main(){ int t; int n,m; int a; scanf("%d",&t); while(t--){ int minn=105; scanf("%d%原创 2013-08-07 15:08:12 · 730 阅读 · 0 评论 -
hdu1561 The more, The Better hdu1011 Starship Troopers
两道相似的树形dp+有依赖的的背包,有依赖的背包的多层依赖关系可以用树表示出来,所以以后遇到多层依赖关系的背包可以考虑将依赖关系表示成一棵树,然后树形DP求解,有依赖的背包的求解使用到分组背包思想,详见背包九讲相关专题#include#include#include#define M 210using namespace std;int n,m;int head[M];struct原创 2013-09-07 20:09:16 · 567 阅读 · 0 评论 -
hdu4514 湫湫系列故事——设计风景线
求树的最长直径,之前做过hdu2196,套用那道题的思路,两次dfs,求出每个结点的最长直径,然后找出最大的即为整棵树的最长直径#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#define M 100010#define ME 1000010using namespace std原创 2013-09-07 19:46:30 · 754 阅读 · 0 评论 -
hdu4705 Y
非连通组合个数=所有组合-连通组合个数树形DP,根结点表示三个连通组合数的中间那个数#include#include#includeusing namespace std;#define M 100010#pragma comment(linker, "/STACK:16777216")struct node{ int v,next;}edge[M*2];int hea原创 2013-09-07 20:26:45 · 748 阅读 · 0 评论 -
hdu4003 Find Metal Mineral
#include#include#include#define M 10010using namespace std;struct node{ int to,val,next;}edge[M*2];int head[M],tot;int dp[M][11],cost[M];int n,s,k;void insert(int u,int v,int val){ e原创 2013-09-09 13:48:53 · 506 阅读 · 0 评论 -
sdut2408 Pick apples(山东第三届省赛)
#include#include#includeusing namespace std;int dp[1000005];int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int lcm(int a,int b){ return a/gcd(a,b)*b;}int main(){ int原创 2014-05-02 23:30:03 · 500 阅读 · 0 评论 -
poj 1276 多重背包
一种优化方法思路来自于hdu2844 Coins原创 2014-04-16 14:26:03 · 373 阅读 · 0 评论 -
poj 3624 01背包 水
水#include#includeusing namespace std;int dp[12890]={0};int main(){ int n,m; int w,d; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d%d",&w,&d); for(int j=m;j>=w;j--) if(dp[j-w]+原创 2014-04-16 14:28:39 · 395 阅读 · 0 评论 -
poj 1948 Triangular Pastures
#include#include#include#includeusing namespace std;bool dp[45][800][800];int a[45];int main(){ int n,i,j,k; int total=0; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); total+=a[原创 2014-04-14 19:53:15 · 494 阅读 · 0 评论 -
CF A. Dynasty Puzzles
这题像背包,每组名字的长度是物品的价值,背包的rong原创 2014-05-03 18:41:52 · 787 阅读 · 0 评论 -
NYOJ15 括号匹配(二)
题目链接 http://acm.nyist.net/JudgeOnline/problem.php?pid=15#include#include#includeusing namespace std;int dp[105][105];char a[105];int main(){ int n; scanf("%d",&n); while(n--){ scanf("%s",a)原创 2014-05-04 18:44:49 · 505 阅读 · 0 评论 -
hdu4427 Math Magic
#include#include#includeusing namespace std;const int MOD=1000000007;int dp[2][1010][1010];int num[1000],LCM[1010][1010];int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}in原创 2013-05-13 20:56:25 · 795 阅读 · 0 评论 -
sdnuoj1032 机器人
1032.机器人Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submission(s): 34 Accepted Submission(s): 7DescriptionSYC喜欢宅在家里,但又不喜欢清理垃圾,有一天实在看不下去了,就把好友ZZK和LG叫来帮忙。没想到他俩更懒,把各自的原创 2013-05-27 20:25:10 · 830 阅读 · 0 评论 -
POJ1159 Palindrome
有人说:“最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度”(S'为原序列S的逆序列) orzorzorzorz(才发现这个有点像人体蜈蚣)自己想出来一个o(n^3)的方法有空再敲出来试试。还有采用滚动数组,不然5000*5000会超。自己写的很短啊#include#include#includeusing namespace std;int f[2][5原创 2013-05-02 00:12:41 · 422 阅读 · 0 评论 -
poj1837 Balance
看了别人的解题报告才知道的状态转移方程,看了之后又感觉没什么,自己做又想不出来,真虐人啊,什么时候才能自己得到状态转移方程啊。写完之后发现代码其实很短#include#include#includeusing namespace std;int dp[21][15001];int main(){ int i,j,k; int n,g; int c[21],w[21]; s原创 2013-05-01 15:14:20 · 405 阅读 · 0 评论 -
poj1088 滑雪
赤裸裸的记忆化搜索。#include#include#includeusing namespace std;int a[101][101];int f[101][101];int r,c;int dfs(int x,int y){ if(xr||yc) return 0; if(f[x][y]!=0) return f[x][y]; int res1=0,res2=0,原创 2013-05-02 00:55:42 · 433 阅读 · 0 评论 -
[NOIP2008]传纸条
见到有人管这叫双线程DP或二路DP,也有四维做法并且更容易理解,但O(n^4)效率低了点【问题描述】小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1原创 2013-05-04 17:11:57 · 518 阅读 · 0 评论 -
poj1160 Post Office
#include#include#include#includeusing namespace std;int a[301];int dis[301][301],dp[301][301];int main(){ int v,p; int i,j,k; scanf("%d%d",&v,&p); for(i=1;i<=v;i++) scanf("%d",&a[i]); me原创 2013-05-05 13:26:02 · 418 阅读 · 0 评论 -
poj2192 Zipper
#include#include#includeusing namespace std;char a[205],b[205],c[410];bool dp[205][205];int main(){ int n; int i,j,t=1; int lena,lenb; scanf("%d",&n); while(t<=n){ scanf("%s%s%s",a,b,c);原创 2013-05-04 23:59:32 · 417 阅读 · 0 评论 -
zoj1013 great equipment
样例输入31 1 35 6 102 1 21 1 1 501 15 62 1样例输出50典型的DP最优填表是二维数组,行表示阶段,列表示状态,继而表格内数据即为该阶段该状态下的最优值。该题每一阶段需要用二维数组表示,每遍历完一个状态就对数组更新一次,这样数组内始终是当前状态下的最优值。#includeusing namespace std;#原创 2012-11-17 11:37:04 · 392 阅读 · 0 评论 -
poj1260 Pearls
#include#includeusing namespace std;int f[105],sum[105];int a[105],p[105];int main(){ int t,c; int i,j; scanf("%d",&t); while(t--){ scanf("%d",&c); sum[0]=0; for(i=1;i<=c;i++){ scanf原创 2013-05-05 13:56:03 · 452 阅读 · 0 评论 -
poj2533 Longest Ordered Subsequence
#include#include#includeusing namespace std;int a[1005],f[1005];int main(){ int n; int i,j; scanf("%d",&n); for(i=0;i<n;i++){ f[i]=1; } for(i=0;i<n;i++) scanf("%d",&a[i]); int maxi=-1;原创 2013-05-07 11:01:06 · 393 阅读 · 0 评论 -
poj1952 BUY LOW, BUY LOWER
求不重复个数好难#include#include#includeusing namespace std;int a[5005],f[5005],count[5005];int main(){ int n; int i,j; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ count[i]=1; f[i]=1; }原创 2013-05-07 11:03:19 · 429 阅读 · 0 评论 -
poj1080 Human Gene Functions
#include#include#include#define max(a,b) (a>b?a:b)using namespace std;char str1[101],str2[101];char map[101];int gene[101][101];int main(){ map['A']=0; map['C']=1; map['G']=2; map['T']=3;原创 2013-05-06 18:20:51 · 389 阅读 · 0 评论 -
poj1050 To the Max
#include#include#includeusing namespace std;int a[101][101];int f[101],ff[101];int main(){ int n; int i,j,r; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); i原创 2013-05-06 18:19:29 · 389 阅读 · 0 评论 -
hdu4512 吉哥系列故事——完美队形I
准备知识:最长公共上升子序列 http://www.clarkok.com/blog/?p=353#include#include#includeusing namespace std;int main(){ int a[210],f[210]; int t,n; int i,j,k,ans; scanf("%d",&t); while(t--){ memset(f,0,原创 2013-05-21 20:05:30 · 461 阅读 · 0 评论 -
【模板】最长公共上升子序列
Description:给定两个序列A,B,其长度分别为N,M,现在要你求出这两个序列中最长的一个公共子序列,并使这个子序列递增。比如数列{1,2,0,4,5}和{1,0,4,5,2},其最长公共上升子序列就是{1,4,5},长度为3。Input:第一行:一个N;第二行:N个数,为数列A;第三行:一个M;第四行:M个数,为数列B。Output原创 2013-05-21 18:54:13 · 621 阅读 · 0 评论 -
hdu2159 FATE
初看是背包问题,但没有往二位费用背包上想。对于最多的杀怪数为k的条件尝试增加一维,dp[i][j]中j表示已杀的怪的数目,得到状态转移方程dp[i][j]=max(dp[i][j],dp[i-1][j-b]+a),每种怪的数目不限,对于第一维[i]是完全背包问题,采用完全背包的顺序循环方式,这样看状态转移方程第二维[j]似乎不是表示已杀的怪的数目,思路在这被卡住了。翻看了一下背包九讲找到了这个问题原创 2013-05-11 17:14:13 · 506 阅读 · 0 评论 -
poj2184 Cow Exhibition
01背包的变形,需要注意的地方很多。很炫的代码来自这位大神http://www.cnblogs.com/rainydays/archive/2012/07/04/2576077.html代码很高效,边界控制很值得学习#include#include#include#define INF 0x3f3f3f3f#define maxs 2000*100#define shift原创 2013-05-05 23:44:19 · 431 阅读 · 0 评论 -
hdu 4739 Zhuge Liang's Mines
#include#include#include#include#includeusing namespace std;struct node{ int x,y;}a[22];vector mine;int dp[(1<<20)+2];int n;bool cmp(node a,node b){ if(a.x==b.x) return a.y原创 2014-04-21 18:30:20 · 563 阅读 · 0 评论