博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38661297
题目大意:竟然还有个背景故事。。。。 其实问题简化一下就是有n个阳台,首尾相接形成一个环,阳台里有怪物,伤害为a[i],你每次可以打掉连续的三个阳台,那么同时,没被打掉的那些怪物会对你造成响应a[i]的伤害。经过几次战斗,你打掉所有阳台的怪物,问受到的伤害最小是多少。
解题思路:本来以为是个记忆化搜索,就让啸哥叫我记忆化搜索,完事发现搜着搜着就搜过去了,具体我也不知道中间用没用记忆化,就只是存了一个较小值,有点记忆化的意思吧。

1 #include <stdio.h> 2 3 int ans; 4 int n; 5 int a[25]; 6 7 void DFS(int sum, int Min){ 8 for(int i = 0; i < n; ++i){ 9 int l = i==0?n-1:i-1; 10 int r = i==n-1?0:i+1; 11 int sub = a[i]+a[l]+a[r]; 12 if(sub > 0){ 13 if(sum-sub == 0){ 14 if(Min < ans){ 15 ans = Min; 16 } 17 continue; 18 } 19 if(Min+(sum-sub) < ans){ 20 int a1 = a[l], a2 = a[i], a3 = a[r]; 21 a[l] = a[i] = a[r] = 0; 22 DFS(sum-sub, Min+(sum-sub)); 23 a[l] = a1, a[i] = a2, a[r] = a3; 24 } 25 } 26 } 27 } 28 29 int main() 30 { 31 scanf("%d", &n); 32 int sum = 0; 33 for(int i = 0; i < n; ++i){ 34 scanf("%d", &a[i]); 35 sum += a[i]; 36 } 37 38 ans = 1<<29; 39 DFS(sum, 0); 40 printf("%d ", ans); 41 42 return 0; 43 }