博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2184
阅读量:6829 次
发布时间:2019-06-26

本文共 1683 字,大约阅读时间需要 5 分钟。

题意:给定一些奶牛,每个牛有s和f两个属性值,有正有负,要求选出一些牛,使得这些牛的两种属性的和的加和最大,且这些牛的两种属性分别求加和不能为负。

分析:dp,开始想到dp[i][s][f],表示前i头牛能否实现属性和分别为s,f。空间和时间都不允许,要将f从状态中拿出來,让f的属性和作为所求的值。即变为d[i][s]=f的形式。表示用前i头牛构成s属性和为s的情况下f属性和最大为多少。状态转移从两种情况来,即用或者不用当前的牛。dp[i][j] = max(dp[i - 1][j - s[i]] + f[i], dp[i - 1][j])。在实际操作的时候可以将第一维去掉,进行空间上的优化。但是由于s[i]的值有正有负,所以在填写数组的顺序要根据s[i]的值来决定,若为正则从右到左(类似01背包的空间优化),若为负则从左到右。

注意:动态规划中状态维和值是可以相互转化的。状态维过多,效率低的时候,可以把将其转化为数组值;同理,数组值不唯一无法规划时,可以增加状态维使状态更详细。

View Code
#include 
#include
#include
#include
using namespace std;#define maxn 105#define maxs 2000 * 100#define shift 1000 * 100#define inf 0x3f3f3f3fint n, s[maxn], f[maxn];int dp[maxs];void input(){ scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", &s[i], &f[i]);}void work(){ for (int i = 0; i < maxs; i++) dp[i] = -inf; dp[0 + shift] = 0; int l = 0, r = 0; for (int i = 0; i < n; i++) { l = min(l, l + s[i]); r = max(r, r + s[i]); int step = 1; int begin = l, end = r; if (s[i] > 0) { step = -1; swap(begin, end); } for (int j = begin; j != end + step; j += step) { dp[j + shift] = max(dp[j - s[i] + shift] + f[i], dp[j + shift]);// printf("%d %d\n", j, dp[j + shift]); } } int ans = 0; for (int i = 0; i <= r; i++) if (dp[i + shift] >= 0) ans = max(ans, i + dp[i + shift]); printf("%d\n", ans);}int main(){ //freopen("t.txt", "r", stdin); input(); work(); return 0;}

转载于:https://www.cnblogs.com/rainydays/archive/2012/07/04/2576077.html

你可能感兴趣的文章
通用权限管理系统组件 (GPM - General Permissions Manager) 中实现高性能的ASP.NET管理页面自动生成...
查看>>
字符串
查看>>
jquery-ui 进度条
查看>>
利胆排石有效方
查看>>
多线程编程需要学习
查看>>
ibatIs中的isNotNull、isEqual、isEmpty
查看>>
深入理解C#的装箱和拆箱
查看>>
《转》c++ 字符串系列:字符编码进阶(下)
查看>>
ubuntu11.04更改默认JDK
查看>>
UPdatepanel失效.
查看>>
SQL Server 2012中的ColumnStore Index尝试
查看>>
使控制台窗口支持鼠标的程序
查看>>
Turbo C(V2.0)编译错误信息
查看>>
Php实现Js的escape方法
查看>>
[置顶] 大整数乘法
查看>>
c#写对象来读取TXT文本文件
查看>>
Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案...
查看>>
Java:网络编程之IP、URL
查看>>
JDBC编程理论知识(1)
查看>>
Android Studio 完美解决 “Android SDK Manager 无法更新“、 ”connection error” 的问题...
查看>>