DFS,枚举,结构上我没加什么优化,很明显有,因为上下可以对称,左右可以对称,对角线也可以对称,但是太复杂了,难得写,就没去优化。
就是对角线上的枚举可能有点让人看不懂吧,我觉得自己画个图,把每个坐标写好,然后看对角线的坐标之间的共同特点就知道该怎么枚举了,代码:
#include <stdio.h>
#include <stdlib.h>
int num[100];
int max_[100][101], min_[100][101];
int sum[100][101];
#define min(a, b) ((a)<(b)?(a):(b))
#define max(a, b) ((a)>(b)?(a):(b))
int rpn = 0xFFFFFFF, rpx;
int main(int argc, char **argv)
{
int i, j, k;
int n, m;
scanf("%d%d", &n, &m);
for(i = 0; i < n; i++){
scanf("%d", &num[i]);
}
for(i = 0; i < n; i++){
for(j = 1; j <= n; j++){
sum[i][j] = sum[i][j - 1] + num[(i + j - 1) % n];
}
}
for(j = 2; j <= n; j++){
for(i = 0; i < n; i++){
min_[i][j] = 0xFFFFFFF;
for(k = 1; k < j; k++){
max_[i][j] = max(max_[i][j], max_[i][k] + max_[(i + k) % n][j - k] + sum[i][k] + sum[(i + k) % n][j - k]);
min_[i][j] = min(min_[i][j], min_[i][k] + min_[(i + k) % n][j - k] + sum[i][k] + sum[(i + k) % n][j - k]);
}
}
}
for(i = 0; i < n; i++){
if(rpx < max_[i][n]){
rpx = max_[i][n];
}
if(rpn > min_[i][n]){
rpn = min_[i][n];
}
}
if(m > rpx){
printf("It is easy\n");
}else if(m < rpn){
printf("I am..Sha...X\n");
}else{
printf("I will go to play WarIII\n");
}
return 0;
}