您的位置:首页 > 其它

Tyvj 1045 最大的算式 DP

2014-03-10 22:49 246 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 110
#define inf -10000
int a
;
int dp

;
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
fill(dp[i][i],dp[i][i]+m+1,a[i]);
}
for(int i=1;i<=n-1;i++){
for(int j=0;j+i<n;j++){
for(int h=0;h<=m&&h<=i;h++){
for(int k=1;k<=i;k++){
for(int v=0;v<=h&&v<=m&&(v<=k-1)&&(h-v-1<=i-k);v++){
//只能为乘的情况
if(i==h)
dp[j][j+i][h]=max(dp[j][j+i][h],dp[j][j+k-1][v]*dp[j+k][j+i][h-v-1]);
else
dp[j][j+i][h]=max(dp[j][j+i][h],max(dp[j][j+k-1][v]+dp[j+k][j+i][h-v],dp[j][j+k-1][v]*dp[j+k][j+i][h-v-1]));
}
}
}
}
}
printf("%d\n",dp[0][n-1][m]);
}
return 0;
}
这种方法就是枚举一段之间每个空格处的符号,然后又因为在枚举的时候需要用到这段内的其他小段的各种情况的结果,所以要先将小的段的结果求出来,这也就确定了dp的方向,一个问题就是注意只能为乘的情况,讨论组里说的那种枚举最后一乘的方法,其实是错的,虽然过了数据。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: