URAL 1152 False Mirrors(记忆化?搜索)

博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38661297

 

False Mirrors

 

题目大意:竟然还有个背景故事。。。。 其实问题简化一下就是有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\n", ans);
41 
42     return 0;
43 }
URAL 1152

 

posted @ 2014-08-18 15:28  GLSilence  阅读(229)  评论(0编辑  收藏  举报