http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=501
和hdu1024一模一样,随便改改就过了。。。
ps:安徽大学oj这个经验值系统真好玩、、
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INF -100000000 int max(int a,int b){ return a>b?a:b; } int a[1100000],p[1100000],q[1100000],now[1100000],pro[1100000];//now记录当前最大值,pro记录前一个的最大值 int main() { int n,k,i,j; int maxsum; while(~scanf("%d%d",&n,&k),(n||k)) { for(i=1;i<=n;i++) scanf("%d",p+i); for(i=1;i<=n;i++) scanf("%d",q+i); for(i=1;i<=n;i++) a[i]=p[i]-q[i]; memset(now,0,sizeof(now)); memset(pro,0,sizeof(pro)); for(i=1;i<=k;i++) { maxsum=INF;//求m段,所以每段计算前要把最大值初始化 for(j=i;j<=n;j++) { now[j]=max(now[j-1]+a[j],pro[j-1]+a[j]);//状态转移 pro[j-1]=maxsum;//记录前一个最大值 if(maxsum<now[j])maxsum=now[j];//更新最大值 } } if(maxsum>0) printf("%d\n",maxsum); else printf("0\n"); } return 0; }