Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
TLE了一把后,看了下同学的代码,惊为天人!我反正是想不到。这个是我在他基础上改的:94msAC #include <iostream> using namespace std; const int N=200001, MID = 100000; int n, a, b, l, r, dp[N];//dp的角标代表sumS,值代表sumF int main() { dp[MID] = MID;//a=0, b=0 scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d %d", &a, &b); l = MID-1000*(i-1)+a;//优化迭代区间 r = MID+1000*(i-1)+a; if(a > 0) { for(int j = r; j >= l; j--)//a > 0 就从反向迭代 if(dp[j-a] || dp[j]) dp[j] = max(dp[j], dp[j-a]+b); } else { for(int j = l; j <= r; j++) if(dp[j-a] || dp[j]) dp[j] = max(dp[j], dp[j-a]+b); } } int ans = 0; for(int i = MID; i < N; i++)//dp[i]在这个区间存在,sumS >= 0 if(dp[i] && dp[i] >= MID)//&& sumF >= 0 ans = max(ans, i-MID+dp[i]-MID); printf("%d\n", ans); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator