Dynamic Programming
文章平均质量分 68
Masamiiiii
这个作者很懒,什么都没留下…
展开
-
2016百度之星热身 1001 递推
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=695&pid=1001#include const int M=1000010;__int64 dp[M];int main() // 题意:要想使第三次搬家和第一次搬家一样 { //则 第二次搬家的结果和没搬家之前的状态一定是一样的原创 2016-05-11 12:29:16 · 303 阅读 · 0 评论 -
hdu 3555 数位dp
http://acm.hdu.edu.cn/showproblem.php?pid=3555#include #define M 25__int64 dp[M][3]; //dp[i][0] 位数为i 不含49的个数 //dp[i][1] 位数为i 不含49的个数 但是尾数为9 //dp[i][2] 位数为i 含49的个数 int num[M]; int mai原创 2016-05-11 20:46:37 · 311 阅读 · 0 评论 -
hdu 2089
http://acm.hdu.edu.cn/showproblem.php?pid=2089#include const int M=101000;int dp[M];// 前i个数字中 unlucky num个数 int fun(int x){ int a[M],i,j,k; i=0; while(x) { if(x%10==4) return 1; if(x%原创 2016-05-10 20:05:55 · 288 阅读 · 0 评论 -
2016百度之星选拔 1002 递推和大数加法
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=690&pid=1002#include #include #include #include using namespace std;const int M=201;int f[M][500];void Add(int x,int y){ int原创 2016-05-14 14:00:09 · 457 阅读 · 0 评论 -
nyoj 104 To the Max
http://acm.nyist.net/JudgeOnline/problem.php?pid=104#include #include #define M 110 //(i,j)看成常数后 枚举i,j int w[M][M],dp[M];// dp[k] 从第i行到第j行 以第k列结尾的最大子矩阵 int main(){ int t,r,c,i,j,k,a[M][M],max原创 2016-05-07 13:32:33 · 486 阅读 · 0 评论 -
POJ 3616 Milking Time dp入门
点击打开链接#include #include using namespace std;const int M =1010;long dp[M]; // dp[i] 一定取第i段能得到的最大值 struct Node{ int start; int end; int efficiency; bool operator<(const Node& t)const { re原创 2016-06-23 13:51:19 · 312 阅读 · 0 评论 -
poj 3280 dp回文
点击打开链接#include #include using namespace std;const int M =2100;int cost[M],dp[M][M]; // dp[i][j] 从 i~j 变为回文的最小花费 char str[M];int main(){ int n,k; cin>>n>>k; scanf("%s",str); for(int i=0;i原创 2016-06-24 12:43:35 · 262 阅读 · 0 评论 -
nyoj 860 (01背包 变形)
点击打开链接http://acm.nyist.net/JudgeOnline/problem.php?pid=860#include #include #include #define Inf 1001000000 using namespace std; const int M=110; // 因为同样价值,重量越小,那么最后能装的价值就可能越大long dp[M][M*M原创 2016-05-20 20:48:00 · 278 阅读 · 0 评论 -
hdu 2602 (01背包入门)
点击打开链接#include #include using namespace std;const int M =1010; // 决策 : 第i件取 或者不取 long vol[M],val[M],dp[M]; // dp[i][j]=max(dp[i-1][j],dp[i-1][j-vol[i]]+val[i])int main()原创 2016-06-25 13:11:22 · 295 阅读 · 0 评论 -
hdu 3496 二维费用背包
点击打开链接#include #include #include using namespace std;const int inf=1<<30;const int M =1100; // 时间->体积 评分 ->价值 int dp[M][M]; // dp[i][j][k] 前I件选不超过J件装进体积为K的最大val // 决策 第i件选或者不选原创 2016-06-25 15:53:49 · 367 阅读 · 0 评论 -
hdu 4508 完全背包入门
点击打开链接#include #include #include using namespace std; // 卡路里->体积 幸福感->价值 const int M =110000; //决策:不选第i种 第i种至少选1个 long vol[M],val[M],dp[M]; // dp[i][j] 前i种物品装入J的最大价值 = max(dp[i-1][原创 2016-06-25 16:55:00 · 341 阅读 · 0 评论 -
hdu 2159 二维完全背包
点击打开链接#include #include #include using namespace std; const int M =110; // 决策 :第i种不选 第i种至少选一只 int vol[M],val[M],dp[M][M]; // dp[i][j][k] 前i种怪兽选j只忍耐度不大于 k的最大价值 =max(dp[i-1][j][原创 2016-06-25 17:46:15 · 312 阅读 · 0 评论 -
nyoj 37 LCS
点击打开链接http://acm.nyist.net/JudgeOnline/problem.php?pid=37#include #include #include #define M 1010using namespace std;int dp[M][M];char s[M],rs[M];int main(){ int t,n,i,j,k,ans; cin>>t; w原创 2016-05-21 19:39:45 · 287 阅读 · 0 评论 -
poj 1014 多重背包入门
点击打开链接#include #include #include using namespace std;const int inf= 1<<30;const int M=330000;int a[7],val[M],vol[M],dp[M];int main(){ int cas=0; while(1) { cas++; long sum=0; for(in原创 2016-06-26 11:53:55 · 308 阅读 · 0 评论 -
hdu 2639 01背包-K优解
点击打开链接#include #include #include using namespace std;const int M = 1100;int val[M],vol[M],dp[M][M]; // dp[i][j][k] 前i件物品装进体积J的第k优解 dp[i][j][k] = 从前一个状态中 2k(可能有重复)选不相同k个依次存入 dp[i][j][k] k=1原创 2016-06-26 22:51:33 · 413 阅读 · 0 评论 -
FZU 2126 消去游戏
点击打开链接#include #include #include using namespace std;const long Mod=1000000007;const int M=1100;// 虚拟栈中球的个数 即为至少放入球的个数 使得全消 // 实际栈放一个球和栈顶不同 虚拟栈就增加k-1个球// 实际栈放一个球和栈顶相同 虚拟栈就减少一个球 long lon原创 2016-07-10 15:01:12 · 272 阅读 · 0 评论 -
poj 2373 dp单调队列优化
点击打开链接#include #include #include using namespace std;const int M = 1001000;const long inf=1<<30;int n,l,a,b,flag[M]; // flag[i] =1 i点有解 int q[M],p[M]; //单调队列,下标 int head=1,tail=0;int dp[M];原创 2016-07-10 22:41:20 · 395 阅读 · 0 评论 -
hdu 1712 分组背包(入门)
点击打开链接#include #include #include using namespace std;const int M =110;int a[M][M],n,m; // a[i][j] 学习i课程j天所得的利益int l[M];//l[i] 第i门课的数量 int dp[M][M]; // 每门课最多学习一次 -> 对每门课程进行决策:dp[k][v] 前k组原创 2016-07-23 11:39:49 · 338 阅读 · 0 评论 -
poj 1742 多重背包,可行性
点击打开链接#include #include #include #include using namespace std;const int M =1100;long n,m;int a[M],c[M];bool dp[M*M]; // 只需判断能否凑成某个价钱k即可 // 给出物品种数和价值 每种物品数量有限 求这些物品能凑成不超过m的价钱有多少种// 等价于原创 2016-07-01 11:16:27 · 431 阅读 · 0 评论 -
poj 3046 dp计数 展开优化
点击打开链接#include #include #include using namespace std;const long long Mod=1000000;const int M=1010;long long num[M],dp[2][10010]; // dp[i][j] 前i种选j个的方法数 dp[i][j]=k=0~num[i]∑dp[i-1][j-k] 展开优化原创 2016-07-05 23:06:08 · 337 阅读 · 0 评论 -
poj 3181 完全背包计数+高精度
点击打开链接#include #include #define Index 1000000000000000000using namespace std;const int inf=1<<20;const int M =1100;unsigned long long p[M],dp[M][2]; // dp[i][j] 前i种物品装入体积j的背包 装满的方法数 //dp[M][0原创 2016-07-06 09:38:11 · 394 阅读 · 0 评论 -
POJ 1661 Help Jimmy
点击打开链接#include #include using namespace std;const int M =21000;const int Inf=1<<30;typedef struct{ int X; int Y; int H;}Node;Node node[M]; int n;bool operator<(const Node a,const Node原创 2016-06-22 10:59:33 · 287 阅读 · 0 评论 -
poj 3666 线性dp
点击打开链接#include #include #include using namespace std;const int M=4100;const int inf=1<<30;int n,a[M],b[M]; //因为花费要最小->修改后的数肯定为原数组中的某个数(反证)-> b[j] 原数组第j小的数 long long int dp[2][M]; // dp[i][j原创 2016-07-08 09:33:04 · 290 阅读 · 0 评论 -
poj 1631 LIS nlogn
点击打开链接#include #include using namespace std;const int M=41000;const int inf=1<<30;int n,a[M],dp[M]; // dp[i] 以i结尾的 LIS长度 //no two signals cross. // 等价于 i<j a[i]<a[j] 才不会Cross // finds the原创 2016-07-07 20:10:57 · 263 阅读 · 0 评论 -
POJ 2229 Sumsets 递推
点击打开链接#include #include #include using namespace std;const int M =101000000; int dp[M]; //dp[n] n的分解方法数 // n是奇数 : 肯定有1个1 还差n-1 dp[n-1] //n如果是偶数 则 1的个数 两种可能 :0个1 dp[n/2]的每个构成原创 2016-06-22 15:48:53 · 305 阅读 · 0 评论 -
poj 2382 Apple Catching 入门dp
点击打开链接#include #include using namespace std;const int M =1010;int dp[M][35]; // dp[i][j] 在i秒内swap j次最多获得的苹果 // 第i秒有两种 决策 要么swap要么停留在原地 //dp[i][j]= max(dp[i-1][j-1],dp[i-1][j]) int main()原创 2016-06-23 10:33:40 · 391 阅读 · 0 评论 -
hdu 3336 Kmp+dp
点击打开链接#include #include #include #include #include using namespace std;const int M =211000;char s[M];int l;int fail[M];int dp[M]; //dp[i]:以s[i-1]结尾的子串的合法个数 //题意 : 求和所有前缀相同的子串个数 // 求s[原创 2016-07-29 14:55:23 · 321 阅读 · 0 评论 -
poj 2392背包条件限制
点击打开链接#include #include #include using namespace std;const int M=40100;const int inf=1<<30;struct Node{ int h; int a; bool operator<(const Node& t)const { return a<t.a; }}node[M];原创 2016-07-08 20:26:30 · 334 阅读 · 0 评论 -
poj 2184 01背包应用
点击打开链接#include #include using namespace std;const int M =100000;const int inf=2*M;int s[M+10],f[M+10]; int dp[2*M+10]; // dp[i][j] 前i只牛的Smartness为 J时 最大的Funness // dp[i][j]= max(dp[i-1][j原创 2016-07-09 13:45:39 · 265 阅读 · 0 评论 -
poj 1837 Balance 01背包(方法数)
点击打开链接#include #include #include using namespace std;const int M =30;int c[M];// hook的位置 int w[M]; //砝码的重量 //放一个砝码对平衡对j所产生的影响为 臂长*重量 c[i]*w[i] int dp[M][16000]; //dp[i][j] 放前i个砝码时 平衡度为j原创 2016-08-01 15:22:32 · 338 阅读 · 0 评论 -
hdu 3033 分组背包+01背包
点击打开链接#include #include #include using namespace std;const int M =110;typedef struct{ int volum; int val;}Data;Data dat[M][M]; // dat[i][j] 第i组种物品中第j件的数据 int dp[M][11000]; // dp[i][j] 前i组原创 2016-07-21 20:10:08 · 327 阅读 · 0 评论 -
FZU 2186 BFS+状压(类似TSP)
点击打开链接#include #include #include #include using namespace std;const int inf=0x3f3f3f3f;const int M = 110;typedef struct{ int x; int y; int t;}node;node move[4]={{-1,0},{1,0},{0,-1},{0,1}原创 2016-09-08 13:00:01 · 327 阅读 · 0 评论 -
hdu 1074 Doing Homework状压dp
点击打开链接#include #include #include #include #include using namespace std;const int M=16;const int inf=1<<20;struct Node{ char str[200]; int deadline; int time;//完成所要时间 }node[M];原创 2016-09-11 12:50:50 · 245 阅读 · 0 评论 -
poj 1185状压DP入门
点击打开链接#include #include #include using namespace std;const int M=65;int n,m,vnum;int dp[110][M][M]; // dp[i][j][k] 第i行排法为J i-1行排法为k时 前i行最多能排的步兵 int map[110];int state[M];//原本一行有1024个状态 打表排除原创 2016-09-02 16:34:21 · 376 阅读 · 0 评论 -
poj 3254 Corn Fields 简单状压dp
点击打开链接#include #include #include using namespace std;const int M = 380;const int Mod=100000000;long long dp[20][M]; // dp[i][j] 前i行的方法数 && 第i行的排放为J int n,m,snum; int map[M];//题目所给的图转化成数字 作用原创 2016-09-03 16:59:40 · 294 阅读 · 0 评论 -
poj 2342 Anniversary party 树形dp入门
点击打开链接#include #include #include using namespace std;const int M =6100;int dp[M][2]; //dp[i][0] i不去 = sigma累加 max(dp[j][0],dp[j][1]) j为i的子节点 // dp[i][1] i去 = sigma 累加 dp[j][0] int n,rat[M]原创 2016-09-03 18:07:46 · 322 阅读 · 0 评论 -
FOJ 2200 环形dp(推荐)
点击打开链接#include #include #include #include using namespace std;const int Mod=1000000007;const int M=1100;int n,k;long long dp[M][M];// 前i个人(等价于连续的i个人)选j个的方法数 &&所选的人距离不为2 //线性时: dp[i][j]= d原创 2016-09-06 16:39:37 · 344 阅读 · 0 评论 -
hdu 3652 数位dp模版题
点击打开链接#include #include using namespace std;const int M =15;int s[M];int dp[M][M][3];// dp[i][mod][staus] 枚举到第i位时 余数为mod 状态为staus // staus:枚举到第i位 没出现13且末尾不为1,没出现13但末尾为1,出现过13 int dfs(int原创 2016-09-18 21:58:27 · 362 阅读 · 0 评论 -
hdu 5900 区间dp
点击打开链接#include #include #include #include using namespace std;const int M=310;typedef long long ll;ll val[M],key[M],sum[M];int table[M][M];//table[i][j] 表示i到j是否都能消完 int can[M][M];//i,j是否互质原创 2016-09-19 18:20:17 · 293 阅读 · 0 评论 -
hdu 2196树形dp经典 树的最长路
点击打开链接#include #include #include #include #include using namespace std;const int M=1e5+20;int n;int vis[M];struct Node{ int v,w; Node(int a,int b) { v=a; w=b; }};vector e[2*M];//双原创 2016-09-19 19:48:34 · 367 阅读 · 0 评论