#include<iostream>
#include<fstream>
using namespace std;
void init();
int max(int a, int b);
int n, k;
int a[10];
int dp[10][10], m[10][10]; //dp[i][j]为前i个数j个乘号时最优解
int main() {
ofstream outfile;
ifstream infile;
outfile.open("D:\\123\\output.txt");
infile.open("D:\\123\\input.txt");
if (!infile.is_open() || !outfile.is_open()) {
cout << "文件打开失败";
return 0;
}
int x = 0; int intxt[12];
for (; !infile.eof(); x++) { //读取数组
infile >> intxt[x];
}
n = intxt[0];
k = intxt[1];
for (int y = 2; y < x - 1; y++) {
a[y - 1] = intxt[y];
}
init();
for (int i = 1; i <= n; i++) { //前i个数字
for (int j = 0; j < i; j++) { //j个乘号
if (j == 0) {
dp[i][j] = m[1][i];
continue;
}
for (int k = 1; k < i; k++) { //枚举所有乘号位置,取最优解
dp[i][j] = max(dp[i][j], dp[k][j - 1] * m[k + 1][i]);
}
}
}
cout << dp[n][k - 1];
outfile << dp[n][k - 1];
infile.close();
outfile.close();
return 0;
}
void init() { //第i到j个数组成的值为m[i][j]
for (int i = 1; i <= n; i++)
m[i][i] = a[i];
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
m[i][j] = m[i][j - 1] * 10 + m[j][j];
}
}
}
int max(int a, int b) {
if (a > b) return a;
return b;
}
最大k乘积问题 文本输入输出
最新推荐文章于 2024-06-26 00:04:43 发布