URAL 1152 False Mirrors(記憶化?搜索)

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


False Mirrors


題目大意:竟然還有個背景故事。。。。 其實問題簡化一下就是有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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章