题目:
代码:
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<fstream>
#include<cstring>
#include<iomanip>
#include<stack>
#include<algorithm>
using namespace std;
int get_max_number(vector<int>data){
int size = data.size();
int **p = new int*[size];
int **sum = new int *[size];
for (int i = 0; i < size; i++){
p[i] = new int[size];
sum[i] = new int[size];
memset(p[i], 0,sizeof(int)*size);
memset(sum[i], 0, sizeof(int)*size);
p[i][i] = data[i];//对角线赋值
sum[i][i] = data[i];
}
//填表
int x, y;
int max_number = -1;
int col = 1;
for (int i = 0; i < size-1; i++){
x = 0;
y = col;
for (int j = 0; j<size - i - 1;j++){//控制个数
sum[x][y] = sum[x][y - 1] + data[y];
p[x][y] = max(sum[x][y] - p[x + 1][y], sum[x][y] - p[x][y - 1]);
if (p[x][y]>max_number)max_number = p[x][y];
x++;
y++;
}
col++;
}
for (int i = 0; i < size; i++){
delete[]p[i];
delete[]sum[i];
}
delete[]p;
delete[]sum;
return max_number;
}
int main(){
ifstream fin("C:\\Users\\Dell\\Desktop\\data.txt");
int num,temp;
vector<int>data;
while (fin>>num){
for (int i = 0; i < num;i++){
fin >> temp;
data.push_back(temp);
}
cout << get_max_number(data) << endl;
data.clear();
}
}
数组p用来存储先取者能拿到的分值数组,p[i][j]表示在坐标区间[i,j]之间的元素中,先取者能拿到的最大和,sum[i][j]表示从i到j的数组的和。其中p[x][y] = max(sum[x][y] - p[x
+ 1][y], sum[x][y] - p[x][y - 1]);