zoj3905 Cake (简单dp)
2015-10-24 20:02
363 查看
题目链接
题意:n个蛋糕(n一定为偶数),第i个蛋糕对A的价值为a[i],对B的价值为b[i],A任取两个蛋糕,B总是把这两个蛋糕中对于他来说价值较大的那个拿走,剩下的一个给A,问A可以拿到的最大价值总和是多少?
思路:将蛋糕按b[i]从大到小排序,这保证了对于第i个蛋糕,任何大于i的蛋糕与它匹配时,B必然选第i个;
dp[i][j]:A在前i个蛋糕中选了j个,因为A一定是挑B剩下的,这意味着 i >= 2*j;
第i个蛋糕被拿走有两种情况
①被B拿走,dp[i][j] = dp[i - 1][j]
②被A拿走,dp[i][j] = dp[i - 1][j - 1] + p[i].a;
代码如下:
题意:n个蛋糕(n一定为偶数),第i个蛋糕对A的价值为a[i],对B的价值为b[i],A任取两个蛋糕,B总是把这两个蛋糕中对于他来说价值较大的那个拿走,剩下的一个给A,问A可以拿到的最大价值总和是多少?
思路:将蛋糕按b[i]从大到小排序,这保证了对于第i个蛋糕,任何大于i的蛋糕与它匹配时,B必然选第i个;
dp[i][j]:A在前i个蛋糕中选了j个,因为A一定是挑B剩下的,这意味着 i >= 2*j;
第i个蛋糕被拿走有两种情况
①被B拿走,dp[i][j] = dp[i - 1][j]
②被A拿走,dp[i][j] = dp[i - 1][j - 1] + p[i].a;
代码如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const ll mod = 7; const int N = 1000; int n; int dp ; struct node { int a, b; bool operator<(const node &rhs) const{ return b > rhs.b; } }p ; int main() { int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d%d", &p[i].a, &p[i].b); } sort(p + 1, p + n + 1); memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) { for(int j = 1; 2 * j <= i; j++) { dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] + p[i].a); } } printf("%d\n", dp [n >> 1]); } return 0; }
相关文章推荐
- 杭电1163--9余项定理的例子
- codeforces 7c line(扩展欧几里得)
- 并发队列之:BlockingQueue和ConcurrentLinkedQueue
- scala学习笔记(4):占位符
- C# 多线程学习系列一:认识多线程
- 动手动脑及作业
- UITextField-->详解
- iOS “智慧气象”APP中用到的第三方框架汇总
- 第四十天:提示符 -- PS1
- Partition函数
- iOS开发9-iOS操作SQLite数据库增删改查
- Java课后作业信1403-2程怀远20142897
- 信1403-2班程怀远20142897《大道至简》读后感
- UVA 11464 暴力+位运算 ***
- kafka及zookeeper安装部署
- 询url包括字符串参数(js高度注意事项)
- B桥接模式ridge
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest H题: Hashing [基础DP]
- HDU-1551 Cable master
- HDU 2732 Leapin' Lizards(最大流)