标签:des style blog class code c
解答:动态规划
dp[j][k] 代表前J位中插入了K个乘号能够达到的最大值
则状态转移方程为
dp[j][k]=max{dp[j][k],dp[i][k-1]*product(k+1,j)};
i是从k变到(j-1);
前J位插入K个乘号所能达到最大的值等于(前i位插入了K-1的乘号与第i+1位到第J位表示的数
(product(k+1,j))的乘积)的最大值。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(x,y) ((x)>(y)?(x):(y)) unsigned long long dp[41][31]={0}; char str[41]; int a[41]; unsigned long long product(int j,int k)//计算第j位到第K位组成的数 { int i; unsigned long long sum=0; for(i=j;i<=k;i++) sum=sum*10+a[i]; return sum; } int main() { int n,K; scanf("%d%d",&n,&K); scanf("%s",str); int i,j,k; for(i=0;i<strlen(str);i++) a[i+1]=str[i]-‘0‘; for(i=1;i<=strlen(str);i++) dp[i][0]=dp[i-1][0]*10+a[i]; for(i=1;i<=K;i++) for(j=1;j<=n;j++) { unsigned long long temp=0; for(k=i;k<j;k++) temp=max(temp,dp[k][i-1]*product(k+1,j)); dp[j][i]=temp; } printf("%lld\n",dp[n][K]); //system("pause"); return 0; }
标签:des style blog class code c
原文地址:http://blog.csdn.net/ruzhuxiaogu/article/details/25695671