博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38661297
题目大意:竟然还有个背景故事。。。。 其实问题简化一下就是有n个阳台,首尾相接形成一个环,阳台里有怪物,伤害为a[i],你每次可以打掉连续的三个阳台,那么同时,没被打掉的那些怪物会对你造成响应a[i]的伤害。经过几次战斗,你打掉所有阳台的怪物,问受到的伤害最小是多少。
解题思路:本来以为是个记忆化搜索,就让啸哥叫我记忆化搜索,完事发现搜着搜着就搜过去了,具体我也不知道中间用没用记忆化,就只是存了一个较小值,有点记忆化的意思吧。
#include <stdio.h>
int ans;
int n;
int a[25];
void DFS(int sum, int Min){
for(int i = 0; i < n; ++i){
int l = i==0?n-1:i-1;
int r = i==n-1?0:i+1;
int sub = a[i]+a[l]+a[r];
if(sub > 0){
if(sum-sub == 0){
if(Min < ans){
ans = Min;
}
continue;
}
if(Min+(sum-sub) < ans){
int a1 = a[l], a2 = a[i], a3 = a[r];
a[l] = a[i] = a[r] = 0;
DFS(sum-sub, Min+(sum-sub));
a[l] = a1, a[i] = a2, a[r] = a3;
}
}
}
}
int main()
{
scanf("%d", &n);
int sum = 0;
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
sum += a[i];
}
ans = 1<<29;
DFS(sum, 0);
printf("%d\n", ans);
return 0;
}