uva 10651 Pebble Solitaire(动态规划:记忆化搜索)

来源:互联网 发布:macbookpro必装软件 编辑:程序博客网 时间:2024/04/30 09:08

题意是对于当前的一行,求出转换到不能再转换状态所需的最多步数

题目看起来没有思路,感觉找不到状态转移方程

看了别人的题解才知道这个题还是很容易的

但是需要想到stl map

我们用dp[s]表示把s转换为不能转换所需的最多步数

如果可以由s转换到t

则有:dp[s] = max(dp[s], dp[t])

因为起始状态不好找,所以用记忆化搜索来写比较好

代码如下:

#include <map>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>using namespace std;string s, t;map<string, int> dp;int dfs(string s) {    if(dp[s]) return dp[s];    dp[s] = 0;    for(int i=0; i<10; ++i) {        if(s[i]=='-' && s[i+1]=='o' && s[i+2]=='o') {            t = s;            t[i] = 'o'; t[i+1] = '-'; t[i+2] = '-';            dp[s] = max(dp[s], dfs(t)+1);        }        if(s[i]=='o' && s[i+1]=='o' && s[i+2]=='-') {            t = s;            t[i] = '-'; t[i+1] = '-'; t[i+2] = 'o';            dp[s] = max(dp[s], dfs(t)+1);        }    }    return dp[s];}int main(void) {    int n, ans;    scanf("%d", &n);    while(n--) {        cin >> s;        ans = 0;        for(int i=0; i<12; ++i)            if(s[i] == 'o')                ++ans;        printf("%d\n", ans-dfs(s));    }    return 0;}


0 0
原创粉丝点击