nyoj_746 整数划分(四)
2016-09-13 09:24
309 查看
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=746
分析:
dp[i][j] : 表示在区间 [0,i] 插入 j 个乘号可以得到的最大值
a[i][j] : 表示区间 [i,j] 所形成的数
则: dp[i][j]=max(dp[k][j-1]*a[k+1][i])
代码:
#include<cstdlib>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<cstdio>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int main()
{
int tt;
scanf("%d",&tt);
ll dp[25][25];
ll a[25][25];
char ss[25];
while(tt--)
{
int m;
scanf("%s%d",ss,&m);
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
m--;
int len = strlen(ss);
for(int i=0;i<len;i++)
{
a[i][i] = ss[i]-'0';
// cout<<a[i][i]<<endl;
for(int j=i+1;j<len;j++)
{
a[i][j] = a[i][j-1] * 10 + ss[j]-'0';
// cout<<a[i][j]<<endl;
}
}
for(int i=0;i<len;i++)
{
dp[i][0]=a[0][i];
}
for(int j=1;j<=m;j++)
{
for(int i=j;i<len;i++)
{
for(int k=0;k<i;k++)
{
dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]);
}
}
}
printf("%lld\n",dp[len-1][m]);
}
return 0;
}
分析:
dp[i][j] : 表示在区间 [0,i] 插入 j 个乘号可以得到的最大值
a[i][j] : 表示区间 [i,j] 所形成的数
则: dp[i][j]=max(dp[k][j-1]*a[k+1][i])
代码:
#include<cstdlib>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<cstdio>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int main()
{
int tt;
scanf("%d",&tt);
ll dp[25][25];
ll a[25][25];
char ss[25];
while(tt--)
{
int m;
scanf("%s%d",ss,&m);
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
m--;
int len = strlen(ss);
for(int i=0;i<len;i++)
{
a[i][i] = ss[i]-'0';
// cout<<a[i][i]<<endl;
for(int j=i+1;j<len;j++)
{
a[i][j] = a[i][j-1] * 10 + ss[j]-'0';
// cout<<a[i][j]<<endl;
}
}
for(int i=0;i<len;i++)
{
dp[i][0]=a[0][i];
}
for(int j=1;j<=m;j++)
{
for(int i=j;i<len;i++)
{
for(int k=0;k<i;k++)
{
dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]);
}
}
}
printf("%lld\n",dp[len-1][m]);
}
return 0;
}
相关文章推荐
- 区间dp----整数划分nyoj746
- nyoj746整数划分(四)【区间dp】
- nyoj 746整数划分(四) 区间DP
- NYOJ 746 整数划分(四)详解 (区间DP)
- NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
- NYOJ746 整数划分(四)
- NYOJ - 746 - 整数划分(四)(区间DP)
- nyoj746 整数划分(四)
- NYOJ746 整数划分(区间DP)
- nyoj746 整数划分 (区间DP4)
- NYOJ 746 整数划分(区间DP)
- nyoj746 整数划分(四)
- nyoj746 整数划分(四)【区间dp】
- nyoj746整数划分(四)【区间dp】
- NYOJ746 整数划分(搜索||DP)
- NYOJ-746整数划分(四)
- 经典问题一.(插入乘号的整数划分)整数划分(四) nyoj 746
- nyoj 整数划分(四) 746 (区间DP)
- nyoj746 整数划分(四)
- nyoj746整数划分(四)