codeforces #267 C George and Job(DP)
职务地址:http://codeforces.com/contest/467/problem/C
太弱了。。这题当时都没做出来。。思路是有的,可是自己出的几组数组总是过不去。。今天又又一次写了一遍。才发现当时一个地方脑残了。。每次选的最大值应该是与更新后的位置的前一个比而不是当前所在的位置。
二维DP。
代码例如以下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; #define LL __int64 LL dp[5001][5001], a[6000], b[6000]; int main() { LL n, m, k, i, j, s; scanf("%I64d%I64d%I64d",&n,&m,&k); memset(dp,0,sizeof(dp)); memset(b,0,sizeof(b)); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<m;i++) { dp[m-1][1]+=a[i]; } s=dp[m-1][1]; for(i=0;i<n-m+1;i++) { b[i]=s; s=s-a[i]+a[i+m]; } /*for(i=0;i<n-m;i++) { printf("%d ",b[i]); }*/ for(i=1;i<n-m+1;i++) { for(j=k;j>=1;j--) { dp[i+m-1][j]=max(dp[i-1][j-1]+b[i],dp[i+m-2][j]); } } /*for(i=0;i<n;i++) { for(j=0;j<=k;j++) { printf("%d ",dp[i][j]); } puts(""); }*/ printf("%I64d\n",dp[n-1][k]); return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。