pku 2184 Cow Exhibition(经典DP)

题意是给n组数,每组数中有S,T值,在其中选取若该组使其所有S+T和最大,要求左边S的和非负,且右边T的和非负。
DP数组dp[i]表示当左边S的和为i时右边T的最大值,这样就很巧妙的装化成01背包问题了(这个是参考别人的)。那最后的解就是满足条件的Max{i+dp[i]}。

#include <iostream> using namespace std; const int base=100000; int DP[200005],s,t,minN,maxN,T,ans; int main() { minN=maxN=0; memset(DP,0x80,sizeof(DP));//初始化为负无穷 DP[base+0]=0; scanf("%d",&T); for(int i=0;i<T;i++) { scanf("%d%d",&s,&t); if(s>0) { for(int i=maxN+base;i>=minN+base;i--) { DP[i+s]=max(DP[i+s],DP[i]+t); } maxN=maxN+s; } else { for(int i=minN+base;i<=maxN+base;i++) { DP[i+s]=max(DP[i+s],DP[i]+t); } minN=minN+s; } } ans=0; for(int i=0+base;i<=maxN+base;i++) { if(DP[i]>=0) ans=max(ans,i-base+DP[i]); } printf("%d/n",ans); return 0; }

你可能感兴趣的:(pku 2184 Cow Exhibition(经典DP))