标签: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