zjnu 1275 最大的算式(Bigexp)(区间DP)
2015-10-28 21:14
453 查看
题目链接:
http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1275
思路:
典型的区间DP。
因为数据范围比较小,所以就开了3维。
设dp[i][j][k]为i~j区间上添加了k个乘号的最大值。
那么就有转移方程:
dp[i][j][k]=max(dp[i][l][m]+dp[l+1][j][k-m],dp[i][l][m]*dp[l+1][j][k-m-1])。
代码:
刚开始以为是邮局问题,就是设了dp[i][j]代表前i个数字里面添加了j个乘号。然后顺利的写出了转移方程:dp[i][j]=max(dp[i][j],dp[k][j-1]*sum[k][i])。但是交上去却Wa了,后来发现有一组样例过不了:
3 1
2 0 0
正确答案应该是2*(0+0)=2,然而我的代码出来是0。模拟了过程后发现,原来这样的方式是不能进行a*(b+c)的操作的,因为我一开始就把dp[i][0]=sum[1][i],也就是将前i个数字套上括号了。= = 。
http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1275
思路:
典型的区间DP。
因为数据范围比较小,所以就开了3维。
设dp[i][j][k]为i~j区间上添加了k个乘号的最大值。
那么就有转移方程:
dp[i][j][k]=max(dp[i][l][m]+dp[l+1][j][k-m],dp[i][l][m]*dp[l+1][j][k-m-1])。
代码:
#include<stdio.h> #include<string.h> #define ll __int64 ll max(ll a,ll b) { return a>b?a:b; } int main() { ll N,K,i,j,k,a[20],dp[20][20][20],sum[20]; scanf("%I64d%I64d",&N,&K); for(i=1;i<=N;i++) scanf("%I64d",&a[i]); memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); for(i=1;i<=N;i++) {sum[i]=sum[i-1]+a[i]; dp[i][i][0]=a[i]; } for(k=0;k<=K;k++) { for(int l=2;l<=N;l++) { for(i=1;i<=N-l+1;i++) { int zhong=i+l-1; for(j=i;j<zhong;j++) { for(int m=0;m<=k;m++) { if(m<k) dp[i][zhong][k]=max(dp[i][zhong][k],max(dp[i][j][m]+dp[j+1][zhong][k-m],dp[i][j][m]*dp[j+1][zhong][k-m-1])); else dp[i][zhong][k]=max(dp[i][zhong][k],dp[i][j][m]+dp[j+1][zhong][k-m]); } } } } } printf("%I64d\n",dp[1] [K]); }
刚开始以为是邮局问题,就是设了dp[i][j]代表前i个数字里面添加了j个乘号。然后顺利的写出了转移方程:dp[i][j]=max(dp[i][j],dp[k][j-1]*sum[k][i])。但是交上去却Wa了,后来发现有一组样例过不了:
3 1
2 0 0
正确答案应该是2*(0+0)=2,然而我的代码出来是0。模拟了过程后发现,原来这样的方式是不能进行a*(b+c)的操作的,因为我一开始就把dp[i][0]=sum[1][i],也就是将前i个数字套上括号了。= = 。
相关文章推荐
- SpringMVC学习系列 之 表单标签
- hdu 1754 I Hate It (线段树)
- 面试心得-----转载
- 输出文本文件倒数n行数据
- 【NOJ】(Java)完美立方
- Base64编码加密的介绍与使用
- 杭电-1015Safecracker(DFS)
- HDOJ 1385 Minimum Transport Cost (最短路 Floyd & 路径记录)
- springmvc form表单标签使用
- [SCOI2009]游戏
- LeetCode Single Number III (xor)
- 给一个数轴,包括正无穷和负无穷,从原点0开始向目标位置x走动(x为整数),第i步,步长为i,求到x的最少步数
- 杭电1163
- 求模和取余
- C# 之 管理配置文件(二)
- PHP7新特性
- UVA10487Closest Sums(二分)
- ACM-ICPC沈阳区域赛B
- ZOJ 1243
- Python线程指南