原题链接:乘积最大
//与题目1312思路完全一致,若代码看不太明白可以去洛谷上看“算式”这题的题解,不用考虑那题的特殊情况,看dp[i][j]那种思路就行
#include <iostream>
#include <vector>
using namespace std;
//ninter函数用于获取区间[i,j]所代表的数字
long long ninter(int i, int j,vector<int> nums) {
long long res = nums[i];
for (int b = i+1; b <= j; b++) {
res = res * 10 + nums[b];
}
return res;
}
int main()
{
int n, k;
cin >> n >> k;
//nums用于读取单个数字,numb用于存储int类型数字便于操作
vector<char> nums(n + 1, 0);
vector<int> numb(n + 1, 0);
//dp[i][j]表示前i个数中有j个乘号时的最大乘积
vector<vector<long long>> dp(n + 1, vector<long long>(k + 1, 0));
//记得把'\n'给读了,这个卡了我一会儿
cin.get();
for (int i = 1; i <= n; i++) {
cin.get(nums[i]);
numb[i] = nums[i] - '0';
}
//初始化dp
for (int i = 1; i <= n; i++) {
dp[i][0] = ninter(1, i, numb);
}
//k代表在第k个位置插入乘号,对于j来说每一轮循环我们插入一个乘号,对于k来说我们将[1,i]的位置都插入乘号(可视为dfs中的选择)
//然后看哪个位置的乘积最大并保留。
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
for (int k = 1; k <= i; k++) {
long long tmp = ninter(k, i, numb);
dp[i][j] = max(dp[i][j], dp[k-1][j-1] * ninter(k,i,numb));
}
}
}
cout << dp[n][k];
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复