博客原文地址: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;
}