您的位置:首页 > 其它

蓝桥杯 求最大值 dp

2016-11-09 19:16 190 查看
   这题很暴力的一个DP,d[i][j]表示前i个数对选择一些Ai的和为j的最大Bi和。

    状态转移方程:

dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=1<<28;
const int maxn=200002;
int dp[101][maxn];
struct node{
int a,b;
}sc[101];
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n;++i){
scanf("%d%d",&sc[i].a,&sc[i].b);
}
for(int i=0;i<=n;++i)
for(int j=0;j<maxn;++j)
dp[i][j]=-inf;
int ab=100000;
for(int i=1;i<=n;++i){
dp[i][ab+sc[i].a]=sc[i].b;
for(int j=0;j<maxn;++j){
dp[i][j]=max(dp[i-1][j],dp[i][j]);
if(j-sc[i].a<=200000&&j-sc[i].a>=0)
dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b);
}

}
int ans=0;
int ind;
for(int i=ab;i<maxn;++i){
if(dp
[i]>=0&&dp
[i]+i-ab>ans) {
ans=dp
[i]+i-ab;
}
}
printf("%d\n",ans);
}
return 0;
}


这个代码有两个可以优化的地方,第一个就是每次可以先把Ai和算出来,避免太多次的运算,空间上能够用滚动数组优化。
如有不当之处欢迎指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: