//与题目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 人评分
2^k进制数 (C++代码)使用递归方法浏览:721 |
数组输出 (C语言代码)浏览:767 |
Tom数 (C++代码)浏览:826 |
C语言训练-求函数值 (C语言代码)浏览:931 |
最小公倍数 (C语言代码)浏览:863 |
C语言训练-数字母 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:534 |
【矩阵】 (C++代码)浏览:936 |
Cylinder (C语言描述,蓝桥杯)浏览:1247 |
数字游戏 (C++代码)浏览:1179 |