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
- uva 10651 Pebble Solitaire(动态规划:记忆化搜索)
- 记忆化搜索 uva-10651-Pebble Solitaire
- uva 10651 - Pebble Solitaire(记忆化搜索)
- UVa 10651 Pebble Solitaire(DP 记忆化搜索)
- UVA 10651 Pebble Solitaire(记忆化)
- UVa 10651 Pebble Solitaire 记忆化搜索+位运算
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
- uva 10651 Pebble Solitaire(dp,状态压缩,记忆化搜索)
- UVa 10651 Pebble Solitaire (DP 卵石游戏 记忆化搜索)
- 【DP】UVA 10651 Pebble Solitaire 记忆化搜索
- uva10651 - Pebble Solitaire(记忆化搜索)
- 【UVA】10651-Pebble Solitaire(直接递归或者记忆化)
- UVA 10651 Pebble Solitaire 鹅卵石摆放 记忆化搜索+DFS+记忆化搜索
- Pebble Solitaire+uva+状态压缩+记忆化搜索
- UVA10651- Pebble Solitaire(位运算+记忆化搜索)
- uva10651 Pebble Solitaire(记忆化搜索)
- Pebble Solitaire(UVA 10651)
- uva 10651 Pebble Solitaire
- srm 619 T2
- 孙鑫MFC视频第二节代码练习(一)类和结构体,类的定义和声明
- 2014年暑假总结
- 函数调用过程探究
- GreenDao 学习笔记 1
- uva 10651 Pebble Solitaire(动态规划:记忆化搜索)
- Java编程思想(七) —— 内部类
- ACdream 1108 分块
- android编程异常解决 FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #195: Erro
- 用模板写选择排序-链表
- 求二叉树中节点的最大距离
- UVA - 10601 Cubes (组合+置换)
- String to Integer (atoi)
- ZOJ Problem Set - 2750