蓝桥杯 算法训练 乘积最大 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大数的写法后期再补.
思路:
这个题的话我的做法就是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; }
相关文章推荐
- 蓝桥杯 算法训练 最大的算式(DP)
- 蓝桥杯——算法训练之乘积最大
- 蓝桥杯 算法训练 乘积最大
- 蓝桥杯算法训练乘积最大
- 蓝桥杯算法训练 乘积最大
- 蓝桥杯——算法训练之乘积最大
- 蓝桥杯 算法训练 乘积最大(动态规划)
- 蓝桥杯算法训练 最大最小公倍数
- 蓝桥杯 算法提高之最大乘积
- 蓝桥杯 算法训练 寻找数组中的最大值
- 蓝桥杯练习系统算法提高—最大乘积
- 蓝桥杯--算法提高 最大乘积(DFS)
- 蓝桥杯 算法提高 最大乘积
- 算法——蓝桥杯篇——乘积最大
- 蓝桥杯 算法训练 最小乘积(基本型)
- 蓝桥杯 算法提高 最大乘积
- 蓝桥杯 算法提高之最大乘积
- 蓝桥杯 算法训练 寻找数组中最大值
- 蓝桥杯算法训练——最大最小公倍数(贪心)
- 蓝桥杯 算法训练 ALGO-2 最大最小公倍数