整数行hdu 1244 Max Sum Plus Plus Plus(dp)

废话就不多说了,开始。。。

    

Max Sum Plus Plus Plus

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 932    Accepted Submission(s): 462

    

Problem Description

    

给定一个由n个正整数组成的整数序列

a1 a2 a3 ... an

求按先后顺序在其中取m段长度分别为l1、l2、l3...lm的不交叠的连续整数的和的最大值。

    

 

    

Input

    

第一行是一个整数n(0 ≤ n ≤ 1000),n = 0表现输入结束
第二行的第一个数是m(1 ≤ m ≤ 20),
第二行接下来有m个整数l1,l2...lm。
第三行是n个整数a1, a2, a2 ... an.

    

 

    

Output

    

输出m段整数和的最大值。

    

 
    每日一道理
闷热的天,蝉儿耐不住寂寞地不停在鸣叫,我孤单一人,寂静的身旁没有一个知音,想疯狂地听摇滚乐,听歇斯底里的歌声,那只为逃避无人的世界里那浓烈的孤单气息。一个人是清冷,两个人便是精彩,于是,莫名的冲动让我格外想念旧日的好友,怀念过去的日子,尽管不够现实的遐想追回不了曾经一切,但却希望思绪可以飞扬于闭上双目后的世界中,印有微笑,印有舞动的身姿,翩翩起舞……

    

Sample Input
3 2 1 1 1 2 3 4 2 1 2 1 2 3 5 0
#include
#include
#include
#include
using namespace std;
#define N 1010
#define M 21
int f[2][N],a[N],b[M];
int main(){
	int i,j,k,l,n,m,T;
	while(scanf("%d",&n)&&n){
		scanf("%d",&m);
		a[0]=b[0]=0;
		for(i=1;i<=m;i++)scanf("%d",&b[i]);
		for(i=1;i<=n;i++){
			scanf("%d",&k);
			a[i]=a[i-1]+k;
		}
//由于输入的是正整数,和是递增的,可得f[i][j]=max(f[i][j],f[i-1][j-b[i]]+sum[j-b[i]+1,j]
		memset(f,0,sizeof(f));
		k=0;l=1;
		for(i=1;i<=m;i++){
			for(j=b[i];j<=n;j++){//第j个放第i组
				f[l][j]=max(f[l][j],f[l][j-1]);
				f[l][j]=max(f[l][j],f[k][j-b[i]]-a[j-b[i]]+a[j]);
			}
			l^=1;k^=1;
		}
		printf("%d\n",f[k][n]);
	}
return 0;
}


 

    

Sample Output
5 10

文章结束给大家分享下程序员的一些笑话语录: 3G普不普及现在已经不是看终端了,而是看应用,有好的,便宜实用的应用,花1000多买个能用的智能手机应该不是什么难事。反过来说,你200元拿一个智能手机,没有好的应用,看个电影要几十元,也是没人用3G。

你可能感兴趣的:(整数行hdu 1244 Max Sum Plus Plus Plus(dp))