阿符长命十万岁


私信TA

用户名:uq_31660518827

访问量:1304

签 名:

等  级
排  名 1788
经  验 2546
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

//与题目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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区