dp入门题解

学dp学到自闭(真的判断不出是个dp问题哇)

来看一下最近学的dp简单的题库.

1.01背包问题(P1048)

这个的特点是每种东西只能拿一次.

https://www.luogu.com.cn/problem/P1048

二维dp:

 1  for(int i=1;i<=m;i++)
 2     {
 3         scanf("%d%d",&w[i],&val[i]);
 4     }
 5     for(int i=1;i<=m;i++)
 6         for(int j=t;j>=0;j--) //注意这个地方是倒着来的
 7         {
 8             if(j>=w[i])
 9             {
10                 dp[i][j]=max(dp[i-1][j-w[i]]+val[i],dp[i-1][j]);
11             }
12             else
13             {
14                 dp[i][j]=dp[i-1][j];
15             }
16         }
17     printf("%d",dp[m][t]);

一维dp:

 1     for(int i=1;i<=m;i++)
 2     {
 3         scanf("%d%d",&w[i],&val[i]);
 4     }
 5     for(int i=1;i<=m;i++)
 6     {
 7         for(int j=t;j>=0;j--)
 8         {
 9             if(j>=w[i])
10             {
11                 dp[j]=max(dp[j-w[i]]+val[i], dp[j]);
12             }
13         }
14     }  

01背包问题可以再加一个例题:

https://www.luogu.com.cn/problem/P1802

1 for(int i=1;i<=n;i++){
2         for(int j=x1;j>=0;j--){
3             if(j>=b[i]){//如果有足够的药剂打赢别人,则看是输好还是赢好
4                 f[j]=max(f[j]+a[i][0],f[j-b[i]]+a[i][1]);
5             }
6             else f[j]+=a[i][0];//没有足够药剂就一个都不用直接认输,不然就浪费了药剂
7         }
8     }

2.完全背包(P1616)

这个与上一个的区别在于:这次的物品可以无限取.每种东西是不限量的.

代码的区别也很简单,这次是正着来的

https://www.luogu.com.cn/problem/P1616

1 for(int i=1;i<=n;i++)
2         for(int j=w[i];j<=V;j++)
3             f[j]=max(f[j],f[j-w[i]]+c[i]);

原文地址:https://www.cnblogs.com/zhmlzhml/p/12638111.html

时间: 2024-10-23 08:04:40

dp入门题解的相关文章

【dp入门题】【跟着14练dp吧...囧】

A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = a[n][j]; 其中dp[i][j]: 深度为i的第j个结点的最大和; 1 /* 2 Problem: HDU-2048 3 Tips: Easy DP 4 dp[i][j]: 深度为i的第j个结点的最大和: 5 dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+

HDU 2084 数塔(简单DP入门)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41852    Accepted Submission(s): 24820 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t

hdu 2993 MAX Average Problem (斜率优化dp入门)

MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5855    Accepted Submission(s): 1456 Problem Description Consider a simple sequence which only contains positive integers as

hdu3507之斜率优化DP入门

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 4780    Accepted Submission(s): 1437 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antiqu

[poj2342]Anniversary party树形dp入门

题意:选出不含直接上下司关系的最大价值. 解题关键:树形dp入门题,注意怎么找出根节点,运用了并查集的思想. 转移方程:dp[i][1]+=dp[j][0];/i是j的子树 dp[i][0]+=max(dp[j][0],dp[j][1]); 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<iostream> 6

HDU 2089 不要62 数位DP入门

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多

poj 3254 Corn Fields 状压dp入门

// poj3254 状压dp入门 // dp[i][S]表示前i行第i行状态为S时放牧的情况 // S为十进制的二进制数形式如5为101表示第一列和第三列放牧的方法数 // 首先dp[0][S]合法的话就是1 // 状态转移方程为dp[i][S] = sigma(dp[i-1][V])(S与V是合法状态) // 最后的结果就是dp[n][S](S为所有的合法状态) // // 刚开始十分傻x的dp[0][S]置为get(S),...get(S)是其中1的个数 // 这又不是求放羊的数量,这是方

poj 2411 Mondriaan&#39;s Dream 状压dp入门

题意: 求h*w的矩形被1*2的小矩形覆盖的方案数. 分析: 状压dp入门,<挑战程序设计竞赛>上讲的很好,好几天才看懂. 代码: #include <iostream> using namespace std; __int64 ans[16][16]; int n,m; __int64 dp[2][1<<16]; __int64 solve() { int i,j,used; memset(dp,0,sizeof(dp)); __int64 *crt=dp[0],*n