您的位置:首页 > 其它

蓝桥杯 算法训练 乘积最大 dp

2017-04-26 23:04 369 查看
题目链接

思路:

这个题的话我的做法就是dp[i][j] 表示前i个字符添加j个乘号的最大值,

那么可得出如下转移方程:

dp[i][j]=max(dp[i][j],dp[w][j-1]+get(w+1,i));

这个题的话我感觉应该longlong也存不下,可能因为蓝桥的数据很水所以就过了,java大数的写法后期再补.

#include<bits/stdc++.h>
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 100000007
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll dp[55][55];
string s;
int n,k;
ll get(int st,int en)
{
ll ans=0;
for(int i=st;i<=en;i++)
ans=ans*10+s[i]-'0';
return ans;
}
int main()
{
Ri(n),Ri(k);
cin>>s;
CLR(dp,0);
for(int i=0;i<n;i++)
dp[i][0]=get(0,i);
for(int i=1;i<n;i++)
{
for(int j=1;j<=i&&j<=k;j++)
{
for(int w=0;w<i;w++)
{
dp[i][j]=max(dp[i][j],dp[w][j-1]*get(w+1,i));
}
}
}
Pl(dp[n-1][k]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: