![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
KubeSpace
这个作者很懒,什么都没留下…
展开
-
hdu 1864 dp (0,1背包) 最大报销额
这道题跟2955的差不多。 不过,这个可以让报销额乘以100,然后,正常的0,1背包了。以报销额为背包,每张发票的总额为价值。 但是,跟2955的思路一样,还可以以发票张数作为背包,以每张发票的总额为价值。 即dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+v[i]); 最后,在不超过报销额的前提下,找出最大的总价值。。。 我这个,能以0ms,240K原创 2013-04-04 18:05:12 · 522 阅读 · 0 评论 -
hdu 1158 (dp)Employment Planning
做的时候,头有点昏。糊里糊涂就ac了。。。 #include using namespace std; int m1[100000],m2[100000]; int main() { int m; int p[13],a,b,c; while(scanf("%d",&m)==1&&m) { scanf("%d %d %d",&a,&b,&c); int mp=0;原创 2013-04-07 20:41:44 · 467 阅读 · 0 评论 -
hdu 1506 (dp) Largest Rectangle in a Histogram
一直long long 过不去。。。然后,改成__int64竟然过了。。。 1505的减弱版。。 分别计算a[i]点的左右比它高的所有相邻的点的长度就可以了。 用l[i],r[i]表示左右的长度。 a[l[i]-1]>=a[i] l[i]=l[l[i]-1]; a[r[i]+1]>=a[i] r[i]=r[r[i]+1]; #include using nam原创 2013-04-08 09:38:22 · 416 阅读 · 0 评论 -
hdu 1081 (dp)
从i行到j行,求出最大值。最大值的求法,跟1003一样。 #include using namespace std; int main() { // freopen("in.txt","r",stdin); int a[105][105]; int n; int b[105]; int sum,max; while(scanf("%d",&n)==1) { for(i原创 2013-04-07 20:36:20 · 387 阅读 · 0 评论 -
hdu 1080 dp Human Gene Functions
分三种情况考虑。 dp[i][j]=max(dp[i-1][j-1]+a[s1[i]][s2[j]],max(dp[i-1][j]+a[s1[i]][4],dp[i][j-1]+a[s2[j]][4])); #include using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { in原创 2013-04-07 20:46:03 · 415 阅读 · 0 评论 -
hdu 4501 (多维背包)小明系列故事——买年货
这么多维的背包,第一次写。 刚开始,一直以一维背包的思维在写。一直wa。 后来,看了下网上的。一对照,发现,并不是对于小于w[i]的就不计算了。而是要计算到0,因为当一个状态不满足时,另两个状态可能满足,也是要计算的。 #include using namespace std; int max(int a,int b) { return a>b?a:b; } int main原创 2013-04-09 14:59:09 · 556 阅读 · 0 评论 -
hdu 4502(dp)
刚开始做,想到的方法是,按照时间顺序,从小到大,排完序之后,在节点i处的最大值一定在满足条件的节点j后。 满足的条件是:第j个节点结束时间小于i节点的开始时间。 那么j可以为1 即 dp[i]=max(dp[i],dp[j])+c[i] (1 #include #include using namespace std; struct work { long s,e,c; }原创 2013-04-09 16:20:22 · 585 阅读 · 1 评论 -
hdu 1561 (树形dp)The more, The Better
dp的思想方法,就是每个状态有很多个策略,然后怎么选择才是最优的。此时,假设它的所有后续状态的所有最优值已经计算出来。 那么,树形dp同样如此。 当到达一个节点i时,剩下j的容量,总共有x个子节点。假设子节点所有最优值已计算出来。而且已经算出来已经选择了k个子节点时的最优值。算选择第k+1的子节点时:(k+1的子节点有z个儿子,y表示i节点给k+1的子节点y的容量) dp[i][k+1][j原创 2013-04-12 14:02:43 · 443 阅读 · 0 评论 -
hdu 1078(dfs+dp)FatMouse and Cheese
dfs+dp 也就是dfs时记忆化所走过的节点。 #include using namespace std; int n,k; int map[105][105]; int dp[105][105]; int Can(int r,int c,int row,int col) { if(row=n||col>=n) return 0; if(map[r][c]>=map[r原创 2013-04-21 14:54:16 · 440 阅读 · 0 评论 -
hdu 1114 (完全背包)
这道题,只需要注意在刚开始的时候,dp[i]=MAX,dp[0]=0。因为要刚好与之对应,要取最大值。 #include using namespace std; #define MAX 10000000 long min(long a,long b) { return a>b?b:a; } int main() { int t; long e,f,n; long dp[1原创 2013-04-07 20:32:33 · 441 阅读 · 0 评论 -
hdu 2191 (多重背包)悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
#include using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int n,m; int dp[105],price[105],w[105],num[105]; int c; scanf("%d",&c); while(c--) { scanf("%d %d",&n,&m原创 2013-04-07 14:34:28 · 473 阅读 · 0 评论 -
hdu 1505 dp City Game
嗯。主要就是记录一行比a[i]的高度高的相邻的长度。然后比较面积最大的。 那么,怎么记录。。。 如果,a[i]左边第一个的高度比a[i]高,那么,搜寻比a[i-1]高的、、、依次类推。若果,a[i-1] 而当到a[i+1]的时候,如果a[i+1] 同理,右边一样这样计算与a[i]相邻的长度。 这时候,就用到了DP的思想。即所有的计算不会重复。计算过一遍之后,记录起来,用的时候,直接拿出来原创 2013-04-03 17:45:53 · 458 阅读 · 0 评论 -
hdu 2571 dp+dfs 命运
dfs+dp dp[i][j]表示从map[i][j] 到map[n][m]的最大值。 #include using namespace std; #define MIN -0x7fffffff int dp[25][1005]; int n,m; int map[25][1005]; int dfs(int r,int c) { if(dp[r][c]>MIN) return原创 2013-04-04 21:15:41 · 523 阅读 · 0 评论 -
hdu 1203 dp(0,1 背包) I NEED A OFFER!
0,1背包。。。只不过,概率问题。。所有费用为背包,。 题目说至少一个学校,那么反过来算,一个学校都没有的话,它的最少概率。 dp[i][j]表示第i个学校有j的费用的时候最少概率。 dp[i][j]=min(dp[i-1][j],dp[i-1][j-a[i]]*(1-b[i])) #include using namespace std; float dp[10005]; in原创 2013-04-04 21:51:56 · 443 阅读 · 0 评论 -
hdu 2955 dp(0,1背包) Robberies
这个,刚开始,想的是所有人的想法,把概率乘到整数,然后0,1背包。 但是,想着要乘几位,于是看了下别人的。。。 没想到,是反过来,把抢的钱看成背包,把逃跑率看成价值。 dp[i][j]表示抢第i家银行要抢j的钱能逃跑的最大概率。 当money[i] 这里因为是概率问题,所以是相乘。 然后呢,当抢到j的钱能逃跑的最大概率要大于不被抓到概率,就表示,j的钱可以抢到。 最后,就是比较j的最原创 2013-04-04 17:50:45 · 443 阅读 · 0 评论 -
hdu 2159 dp(二维完全背包)
#include using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int n,m,k,s; int dp[105][105]; int a[105],b[105]; while(scanf("%d %d %d %d ",&n,&m,&k,&s)==4) { for(int i=原创 2013-04-05 14:08:36 · 466 阅读 · 0 评论 -
hdu 4508 (完全背包)
#include using namespace std; int max(int a,int b) { return a>b?a:b; } int main() { int n,m; int a[105],b[105]; int dp[100005]; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++) scanf("%d %原创 2013-04-05 14:38:26 · 471 阅读 · 0 评论 -
hdu 2870 dp
这道题跟1505 City Game 类似。不过,就是多了两个策略。。。。 #include using namespace std; int main() { int left[1005][3]; int right[1005][3]; int a[1005][3]; int m,n,max; char ch; while(scanf("%d %d",&m,&n)==2)原创 2013-04-06 14:43:03 · 406 阅读 · 0 评论 -
hdu 2830 dp
#include #include using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int n,m; char ch; int a[1005]; int b[1005]; while(scanf("%d %d",&n,&m)==2) { int max=0; for(int i原创 2013-04-06 18:14:22 · 406 阅读 · 0 评论 -
hdu 1011(树形dp)Starship Troopers
树形dp。 dp[i][j]=max{dp[i][j],dp[i][j-k]+dp[son[i]][k]} 给每个儿子节点分配k的容量。 #include #include #include using namespace std; vector v[105]; int dp[105][105]; int num[105],cost[105]; int n,m; int vis[原创 2013-04-12 17:09:54 · 393 阅读 · 0 评论