[UESTC876]爱管闲事

来源:互联网 发布:java中的迭代器是什么 编辑:程序博客网 时间:2024/05/18 00:09

Time Limit: 3000/1000MS (Java/Others)
Memory Limit: 65535/65535KB (Java/Others)

春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学。

现在有n个同学需要他的帮助,虽然他很想一天之类帮助所有人,但毕竟精力有限,于是他决定分m天来帮助他们。
根据事情的重要性,春希帮助不同同学会有不同的快乐值,而春希获得的总的快乐值为每天获得的快乐值的乘积。

现在给出n和m,以及帮助完各同学时获得的快乐值,求春希能获得的最大快乐值。

Input

第一行为一个整数T,代表数据组数。
每组数据,第一行两个整数n,m。表示需要帮助的同学的数量,和天数。(1mmin(n,10),1n20)

第二行为n个整数,表示帮助这个同学的获得的快乐值,每个快乐值不大于5。
Output

每组数据输出一行,一个整数,表示最大的快乐值。

Sample Input

15 33 2 1 4 5

Sample Output

125

题解:区间DP
f[i][j]表示前i个数字分成j份能达到的最大快乐值。
则我们可以推出方程
f[i][j]=max(f[i][j],f[k][j1]sum(k+1,i))
sum(l,r)表示区间[l,r]的和

#include<bits/stdc++.h>#define LiangJiaJun mainusing namespace std;int f[24][24],a[24],m,n,T;int sum(int l,int r){    int ge=0;    for(int i=l;i<=r;i++)ge += a[i];    return ge;}int w33ha(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    for(int i=0;i<=22;i++)        for(int j=0;j<=22;j++){            if(j<=i)f[i][j]=1;            else f[i][j]=0;        }    for(int i=1;i<=n;i++){        int x=1;        for(int j=1;j<=i;j++)x*=a[j];        f[i][i]=x;    }    for(int i=1;i<=n;i++){        for(int j=1;j<=i;j++){            for(int k=j-1;k<i;k++){                f[i][j]=max(f[i][j],f[k][j-1]*sum(k+1,i));            }        }    }    printf("%d\n",f[n][m]);    return 0;}int LiangJiaJun(){    scanf("%d",&T);    while(T--)w33ha();    return 0;}
原创粉丝点击