碰着一道区间dp,看着不难,就是不明白,强制性输出,明白一丢丢:
原代码链接:https://blog.csdn.net/my_sunshine26/article/details/77141398
【题意】
给出一个数n,要求在n的数位间插入(m-1)个乘号,将n分成了m段,求这m段的最大乘积。
原代码:
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
typedef long long ll;
const int maxn = 25;
const ll mod = 1e9+7;
const ll INF = 1e18;
const double eps = 1e-9;
int m;
char s[maxn];
ll dp[maxn][maxn];
ll num[maxn][maxn];
int main()
{
rush()
{
scanf("%s%d",s+1,&m);
mst(dp,0);
int len=strlen(s+1);
for(int i=1;i<=len;i++)
{
num[i][i]=s[i]-'0';
for(int j=i+1;j<=len;j++)
{
num[i][j]=num[i][j-1]*10+s[j]-'0';
}
}
for(int i=1;i<=len;i++)
{
dp[i][0]=num[1][i];
}
for(int j=1;j<m;j++)
for(int i=j+1;i<=len;i++)
for(int k=j;k<i;k++)
{
dp[i][j]=max(dp[i][j],dp[k][j-1]*num[k+1][i]);
}
printf("%lld\n",dp[len][m-1]);
}
return 0;
}
代码牛皮*:
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#include<iostream>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
typedef long long ll;
const int maxn = 25;
const ll mod = 1e9+7;
const ll INF = 1e18;
const double eps = 1e-9;
int m;
char s[maxn];
ll dp[maxn][maxn];
ll num[maxn][maxn];
//num[i][j]代表数值,从char转换成long long 类型,
int main()
{
rush()
{
scanf("%s%d",s+1,&m);
mst(dp,0);
int len=strlen(s+1);
for(int i=1;i<=len;i++)
{
num[i][i]=s[i]-'0';
for(int j=i+1;j<=len;j++)
{
num[i][j]=num[i][j-1]*10+s[j]-'0';
cout<<" num["<<i<<"]["<<j<<"]="<<num[i][j]<<endl;
}
}
for(int i=1;i<=len;i++){
dp[i][0]=num[1][i];
}
for(int j=1;j<m;j++){//m段,m-1个乘号
cout<<" j="<<j<<endl;
for(int i=j+1;i<=len;i++){//第一位到第i位共插入j个乘号后乘积的最大值
cout<<" i="<<i<<endl;
for(int k=j;k<i;k++){
cout<<" k="<<k<<endl;
cout<<" dp["<<i<<"]["<<j<<"]="<<dp[i][j]<<endl;
dp[i][j]=max(dp[i][j],dp[k][j-1]*num[k+1][i]);
cout<<" dp["<<k<<"]["<<j-1<<"]*num["<<k+1<<"]["<<i<<"]="<<dp[k][j-1]*num[k+1][i]<<endl;
cout<<" dp["<<i<<"]["<<j<<"]="<<dp[i][j]<<endl;
}
}
}
printf("%lld\n",dp[len][m-1]);
}
return 0;
}
运行结果:
样例:
样例输入
2
111 2
1111 2
样例输出
11
121