dp之区间:最大k乘积
题目:给你一个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位数的数值.......
#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; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。