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的方向,一个问题就是注意只能为乘的情况,讨论组里说的那种枚举最后一乘的方法,其实是错的,虽然过了数据。。。
相关文章推荐
- tyvj 1045 最大的算式 在n个数字中加k个乘号和n-k-1个加号,使最后结果最大
- tyvj-1045 DP
- tyvj1305 最大子序和 【单调队列优化dp】
- 算法训练 最大的算式 dp
- tyvj1305 最大子序和 【单调队列优化dp】
- 蓝桥杯 算法训练 最大的算式(DP)
- 蓝桥杯——最大的算式——DP
- TYVJ P1045最大的算式(动态规划)
- Tyvj1305最大子序和(单调队列优化dp)
- TYVJ P1045 最大的算式
- zjnu 1275 最大的算式(Bigexp)(区间DP)
- 【区间DP】最大的算式
- HDU 2845 Beans(DP,最大不连续和)
- tyvj-1034 DP
- POJ1651 Codevs1017 乘积最大 ---2000年NOIP全国联赛提高组 dp
- HDU1087--Super Jumping! Jumping! Jumping! (DP动态规划最大上升子序列的和)
- 【最大连续子序列和dp】hdu 1003 Max Sum
- 51Nod Problem 1102 面积最大的矩形(DP)
- hdu1231 最大连续子序列(DP之最大子序列和)
- hdu 1024 Max Sum Plus Plus (最大m子段和)(经典DP)(转)