武大网赛预赛 Problem 1538 - B - Stones II .
2014-04-07 21:23
232 查看
这题我在比赛中首先想到就是用dp去写,无奈的是某渣的dp功底实在是弱的一B,根本就写不出动态转移方程啊
比赛后又想了一下,不过我顶多想到一维dp,最后发现自己还是WA了,用一维在更新最优解的时候会出问题
看了别人的解题报告后才知道用二维dp一下就做出来了
首先将b从小到大排序
然后dp【i】【j】= max(dp【i-1】【j】, dp【i-1】【j-1】 + p【i】.a - p【i】.b* (j-1))
其中dp【i】【j】 表示前i个里面取j个时的a最大总和
代码:
比赛后又想了一下,不过我顶多想到一维dp,最后发现自己还是WA了,用一维在更新最优解的时候会出问题
看了别人的解题报告后才知道用二维dp一下就做出来了
首先将b从小到大排序
然后dp【i】【j】= max(dp【i-1】【j】, dp【i-1】【j-1】 + p【i】.a - p【i】.b* (j-1))
其中dp【i】【j】 表示前i个里面取j个时的a最大总和
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[1111]; struct node { int a; int b; }p[1111]; int cmp(node x, node y) { return x.b > y.b; } int main() { int n; while(scanf("%d",&n)!=EOF && n) { memset(dp, 0, sizeof(dp)); for(int i= 1; i<= n; i++) scanf("%d %d",&p[i].a, &p[i].b); sort(p+1, p+n+1, cmp); for(int i= 1; i<= n; i++) for(int j= i; j>= 1; j--) { int hehe= dp[j-1] + p[i].a - p[i].b*(j-1); if( hehe> dp[j]) dp[j]= hehe; } int ans= dp[1]; for(int i= 2; i<= n; i++) if(dp[i]> ans) ans= dp[i]; printf("%d\n", ans); } return 0; }
相关文章推荐
- C++析构函数的调用
- 在rubymine中启动应用。产生 Library not loaded: libmysqlclient.18.dylib (LoadError) 错误的解决办法
- ReportStudio入门教程(十四) - 隐藏后的单元格显示
- hadoop异常java heap space
- 设计模式学习2——策略模式
- 生活--2014年清明节
- 递归的一般过程
- 乘法口诀右对齐和左对齐
- 风吹过你走的那一刻,带走了你最后的足印,抹拭了我唯一追寻的方向
- xamarin studio And linq 查询方式分析
- linux下sed的使用(上)
- SQL语法的重要知识点总结
- 动态规划 传球问题
- c程序编写过程流程
- 二叉排序树
- Codeforces Round #240 (Div. 1) ABCD
- HDU2594 Simpsons’ Hidden Talents
- 产品经理,农业未来就靠你们了!
- Android OpenGL ES正方体纹理贴图(每个面一张)
- C++ cin cout