dp之区间:最大k乘积
2013-07-31 20:51
183 查看
题目:给你一个n(1<=n<=15)位数,求将它分成m段,用m-1个*连接起来的最大乘积.......
思路:定义dp[i][j]为将前i位数分成j段的最大乘积,那么dp[i][j]==max(dp[k][j-1]*a[i-k]);其中(1<=k<i),其意思就是把前k(1<=k<i)个数分成j-1段,再乘以a[i-k],a[i-k]代表着,第k位到第i位数的数值.......
思路:定义dp[i][j]为将前i位数分成j段的最大乘积,那么dp[i][j]==max(dp[k][j-1]*a[i-k]);其中(1<=k<i),其意思就是把前k(1<=k<i)个数分成j-1段,再乘以a[i-k],a[i-k]代表着,第k位到第i位数的数值.......
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; int dp[30][30]; int n,m,len; int huafen(int w,int v) { int j=w+v; int tmp=n/(int)(0.5+pow(10,(double)(len-j))); tmp%=(int)(0.5+pow(10,(double)(j-w))); //printf("%d\n",tmp); return tmp; } int deal(int len,int m) { int maxx,tmp; for(int i=1;i<=len;i++) //先将前i个数分成一段的情况全部求出 { dp[i][1]=huafen(0,i); //huafen函数就是求一个数的前i位数为多少 //printf("%d\n",i); } //printf("jjjj\n"); for(int j=2;j<=m;j++) { for(int i=j;i<=len;i++) { tmp=0; for(int k=1;k<i;k++) { maxx=dp[k][j-1]*huafen(k,i-k); //这里是精髓....... if(tmp<maxx) tmp=maxx; } dp[i][j]=tmp; } } return dp[len][m]; } int main() { while(scanf("%d %d",&n,&m)>0) { len=(int)(log10((double)n)+0.5)+1;//位数 printf("%d\n",deal(len,m)); } return 0; }
相关文章推荐
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
- POJ - 1050 To the Max(区间DP最大字串和,最大子矩阵和模板)
- POJ 3616【数状数组求区间最大值 + 简单DP】
- 【hihocoder 1388】【区间DP】A Game【给出一个数列,两人每次从数列的头尾取数,小ho 先取,小hi每次都采取最优策略,问小ho最终能取得的数的总和最大是多少】
- hdu 4293 dp求最大权值不重合区间
- NYOJ 742 —— 最大m段和 【区间DP】
- hrbustoj1212 乘积最大 区间DP
- nefuoj1204-区间dp&前缀处理-分段乘积最大
- zjnu 1186 乘积最大(区间DP)
- poj 2955 区间dp 最大括号匹配数
- luogu1018【2000提高】乘积最大(区间dp)
- POJ 2955 Brackets(括号最大匹配,区间DP)
- POJ 2955 Brackets 区间DP 最大括号匹配
- UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化
- POJ 2355(区间最大值-zkw线段树优化Dp方程)
- 括号最大匹配(区间dp)
- UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)
- zjnu 1275 最大的算式(Bigexp)(区间DP)
- OpenJudge 1768 最大子矩阵(区间dp)
- light oj 1031 - Easy Game(区间DP->轮流取值的最大差值)