#include <iostream>
using namespace std;
int main(){
int n = 4;
int arr[] = { 4, 4, 5, 9 };
int **sums = new int*[n];//记录从第i个到i+j个的最后一次的分数
for (int i = 0; i < n; i++){
sums[i] = new int[n]();
}
int **mins = new int*[n];//记录最小总分
for (int i = 0; i < n; i++){
mins[i] = new int[n]();
}
int **maxs = new int*[n];//记录最大总分
for (int i = 0; i < n; i++){
maxs[i] = new int[n]();
}
for (int j = 1; j < n; j++){//j表示距离即加入序列的总个数
for (int i = 0; i < n; i++){//i表示起点
for (int k = 0; k <= j; k++){
sums[i][j] = sums[i][j] + arr[(i+k+n)%n];
}
}
}
for (int j = 1; j < n; j++){//j表示距离即加入序列的总个数
for (int i = 0; i < n; i++){//i表示起点
mins[i][j] = INT_MAX;//mins[i][j]表示从第i个起到i+j个序列中的最小得分
maxs[i][j] = 0;//maxs[i][j]表示从第i个起到i+j个序列中的最大得分
for (int k = 0; k < j; k++){//k表示合并序列的拆分
mins[i][j] = mins[i][j] < (mins[i][k] + mins[(i + k + 1) % n][j - k - 1] + sums[i][j]) ?
mins[i][j] : (mins[i][k] + mins[(i + k + 1) % n][j - k - 1] + sums[i][j]);//寻找最小分数的合成次数
maxs[i][j] = maxs[i][j] > (maxs[i][k] + maxs[(i + k + 1) % n][j - k - 1] + sums[i][j]) ?
maxs[i][j] : (maxs[i][k] + maxs[(i + k + 1) % n][j - k - 1] + sums[i][j]);
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cout << sums[i][j] << " " ;
}
cout << endl;
}
cout << endl;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cout << mins[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
cout << maxs[i][j] << " ";
}
cout << endl;
}
cout << endl;
int vmin = INT_MAX;
int vmax = 0;
for (int i = 0; i < n; i++){
vmin = mins[i][n - 1] < vmin ? mins[i][n - 1] : vmin;
vmax = maxs[i][n - 1] > vmax ? maxs[i][n - 1] : vmax;
}
cout << "最小得分:" << vmin << endl;
cout << "最大得分:" << vmax << endl;
return 0;
}
石子合并问题
最新推荐文章于 2022-04-25 22:03:16 发布