
acm_动态规划
GrimCake
这个作者很懒,什么都没留下…
展开
-
HDU-2602 Bone Collector(01背包)
第一种方法 #include #include #include using namespace std; int dp[1000][1000];//大数组声明为全局变量才不会报错 int main(){ int T; cin>>T; while(T--){ int n,w; cin>>n>>w; int value[1000],cost[1000]; memset(dp,原创 2017-02-16 19:43:05 · 221 阅读 · 0 评论 -
codeforces-915D Almost Acyclic Graph(拓扑序判圈)
链接:http://codeforces.com/problemset/problem/915/D题意:在一个有向图中,判断能不能至多删除一条边使得该图不含圈,n<=500, m<=100000题解:枚举每一个点,让该点的入度减一,然后拓扑序判圈代码:#include<iostream> #include<cstdio> #include<cstring&...原创 2018-04-05 20:58:37 · 258 阅读 · 0 评论 -
codeforces-4D Mysterious Present(二维递增子序列)
链接:http://codeforces.com/problemset/problem/4/D题意:二维递增子序列题解:先排序,dp【i】表示以i结尾的最长递增子序列的长度,dp【i】= max{dp【j】+1,dp【i】} j<i, p[i].w>p[j].w&& p[i].h>p[j].h, 注意边界及一些特殊情况代码:#include<iostrea...原创 2018-04-16 09:41:15 · 247 阅读 · 0 评论 -
codeforces-2B The least round way(dp+路径记录)
链接:http://codeforces.com/problemset/problem/2/B题意:在一个棋盘上从左上角走到右下角,求经过点的乘积的结果尾数的0最少,要输出路径题解:记录每个格子2和5的因子数,做两次dp,取较小的那个。有0的情况要特殊判断,可以把0当作10,最后的结果如果大于1,那么按照经过0来处理。记录路径记录前驱即可。但是不知道test 31为何wa了。。代码:#includ...原创 2018-04-09 22:32:23 · 218 阅读 · 0 评论 -
Luogu-P1057传球游戏(dp)
含多个递推公式 #include #include using namespace std; int main(){ int n,m,dp[40][40]; memset(dp,0,sizeof(dp)); dp[1][0]=1; cin>>n>>m; for(int k=1;k<=m;k++){ dp[1][k]=dp[2][k-1]+dp[n][k-1];//需要特判 dp[原创 2017-04-06 20:15:56 · 571 阅读 · 0 评论 -
Luogu-P1025数的划分(dp)
把n划分成k个数相加,不考虑顺序的不同,如把7划分成3份 151,115,511算同一种 写出状态转移方程dp[i][j]=dp[i-j][j]+dp[i-1][j-1],dp[i][j]表示把i划分为j份,有两种可能,一种是至少有一份是1,另一种是没有一份是1,dp[i-j][j]表示没有1份是1,先从i中拿出j平均放进j堆里,保证每一堆都不空,那么还剩下i-j再进行分配。dp[i-1][j-原创 2017-04-06 19:22:12 · 496 阅读 · 0 评论 -
Luogu-p1020导弹拦截(最长上升子序列 Dilworth定理)
最少链划分 = 最长反链长度 所以最少多少套系统= 最长导弹高度上升 序列长度 虽然不是很明白为什么。。原创 2017-04-10 21:30:56 · 375 阅读 · 0 评论 -
Luogu-p1164小A点菜(dp dfs)
在N种菜中点若干个菜恰好用了M元的方案数,用两种方法写 DFS: #include #include using namespace std; int n,m,a[105],sum=0,T=0,dp[105][10005]; void dfs(int i,int money){ //cout<<i<<" "<<sum<<endl; if(money==0){ T++; retur原创 2017-04-08 01:05:39 · 309 阅读 · 0 评论 -
Luogu-p1060开心的金明(01背包)
#include #include #include #include #include using namespace std; long long n,m,v[30005],w[30005],dp[26][30005]; int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>v[i]>>w[i]; } memset(dp,0,s原创 2017-04-07 22:49:27 · 431 阅读 · 0 评论 -
Luogu-p1115最大子段和(连续子序列最大和)
dp[i]=max(dp[i-1]+a[i],a[i]); 注意数组范围 #include #include #include #include using namespace std; long long n,a[200005],dp[200005]; int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } dp[0]=原创 2017-04-07 21:37:15 · 501 阅读 · 0 评论 -
数字三角形
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。 注意:路径上的每一步只能从一个数走到下一层上原创 2017-02-01 00:25:12 · 472 阅读 · 0 评论 -
连续子序列最大和
如6 -1 5 4 -7 最大和是14 0 6 -1 1 -6 7 -5 最大和是7 #include #include #include using namespace std; int main(){ int T,n; cin>>T; while(T--){ cin>>n; int a[n+1],dp[1000]; memset(dp,0,sizeof(d原创 2017-02-14 17:49:28 · 356 阅读 · 0 评论 -
最长上升子序列
#include #include #include #include using namespace std; int main(){ int n; cin>>n; int dp[100],a[100]; fill(dp,dp+n,1); dp[0]=1; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;原创 2017-02-13 23:13:38 · 300 阅读 · 0 评论 -
uva 11584 - Partitioning by Palindromes(简单dp)
把一个字符串划分成尽量少的回文串 dp[i]表示从1到i划分成的最少回文串数,judge函数判断从j到i是否为回文串 #include #include #include using namespace std; char str[1005]; int dp[1005]; const int IN=0x3f3f3f;//无限大的设置方法 bool judge(int l,int r){原创 2017-02-13 21:27:33 · 262 阅读 · 0 评论 -
UVa-10943 How do you add
dp[i][j]表示把i拆成j个数的方法数 状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1] 可以想象成把这j个数字排成一列,dp[i-1][j]表示在第j个数的位置加1并更新状态继续考虑第j个数位置的情况(继续加1或者不加),dp[i][j-1]表示不再往第j个数的位置加数字,从而考虑第j-1个数位置的情况(加1或者不加) #include #include #in原创 2017-02-20 22:56:52 · 259 阅读 · 0 评论 -
UVa-11137 Ingenuous Cubrency
dp[i][j] 记录最大的数不超过i,和为j的方法数 dp[i][j]=dp[i-1][j]+dp[i][j-I*I*i] 前半部分表示不使用i,后半部分表示使用i #include #include using namespace std; long long dp[23][10000+5]; int main(){ int n; memset(dp,0,sizeof(dp));原创 2017-02-19 21:32:30 · 319 阅读 · 0 评论 -
HDU-1087 Super Jumping! Jumping! Jumping!(上升子序列最大和)
和求最长上升子序列的元素个数有点相似,状态转移方程为dp[i]=max(dp[j]+a[i],dp[i])其中a[j] #include #include #include using namespace std; const int p=-0x3f3f3f3f; int main(){ int n; long long a[1000+1]; long long dp[1000+1];原创 2017-02-16 22:13:18 · 260 阅读 · 0 评论 -
HDU-1520 Anniversary party(树形dp)
题意:给一棵树,每个节点有一个权值,从中选一些点,相邻节点不能同时选,问能选的最大值是多少 代码: #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; int dp[6010][2]; int a[6010];...原创 2018-07-17 13:04:02 · 204 阅读 · 0 评论