原题链接:乘积最大
//与题目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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复