zoj3905 Cake (简单dp)
来源:互联网 发布:中国的阿拉伯之春 知乎 编辑:程序博客网 时间:2024/05/22 17:15
题目链接
题意: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[N][N];struct node{int a, b;bool operator<(const node &rhs) const{return b > rhs.b;}}p[N];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][n >> 1]); } return 0;}
0 0
- zoj3905 Cake (简单dp)
- 贪心+dp zoj3905 Cake
- zoj3905 Cake (dp)
- zoj3905 Cake
- zoj3905 贪心dp
- zoj3905
- zoj3905
- ZOJ 3905 Cake (DP)
- 1629 - Cake slicing(DP)
- ZOJ 3905 Cake(dp)
- ZOJ 3905 Cake(dp)
- zoj 3905 Cake(状压dp)
- UVa 1629 Cake Slicing DP
- ZOJ-3905-Cake【贪心】【dp】
- uva - 1629 Cake slicing(dp)
- uva 1629 cake slicing(dp)
- Uva-1629 Cake slicing(DP)
- hdu - 4328 - Cut the cake - dp
- 9余数定理
- ios开发系列之XML解析和JSON解析数据
- 进程间通信简介(二)——管道
- Codeforces 589D Boulevard 线段相交
- LeetCode 36: Valid Sudoku
- zoj3905 Cake (简单dp)
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest H题: Hashing [基础DP]
- HDU-1551 Cable master
- kafka及zookeeper安装部署
- Partition函数
- window7下用wubi安装ubuntu
- IDF 牛刀小试-ASCII码而已
- iOS开发9-iOS操作SQLite数据库增删改查
- Swift2.0推送