VA - 10651 Pebble Solitaire

题目大意:给出一个12格的棋盘,‘o'代表摆放棋子,’-‘代表没有棋子, 当满足’-oo'时, 最右边的棋子可以跳到最左边的位子,而中间的棋子则被消除,‘o--', 问对于一个给定了的棋盘,通过上述消除棋子的方法最后最少剩几个棋子在棋盘上。


解题思路:递归搜索 + 记忆化, 并且记忆化的值为所有测试数据公用的,也就是说在程序运行的开始初始化后,后面无需再进行清0。


#include <iostream>
#include <string>
#include <map>
using namespace std;
map <string, int> DP;

int dps(string t) {
	if (DP[t] > 0) 
		return DP[t];
	DP[t] = 0;
	string temp;
	for (int i = 0; i < 10; i++)
		if (t[i] == 'o' && t[i+1] == 'o' && t[i+2] == '-') {
			temp = t;
			temp[i] = temp[i+1] = '-';
			temp[i+2] = 'o';
			DP[t] = max(DP[t], dps(temp) + 1);
		} else if (t[i] == '-' && t[i+1] == 'o' && t[i+2] == 'o') {
			temp = t;
			temp[i+1] = temp[i+2] = '-';
			temp[i] = 'o';
			DP[t] = max(DP[t], dps(temp) + 1);
		}
	return DP[t];
}

int main() {
	int T;
	cin >> T;
	while (T--) {
		string s;
		int ans = 0;
		cin >> s;
		for (int i = 0; i < 12; i++)
			if (s[i] == 'o')
				ans++;
		cout << ans - dps(s) << endl;
	}
	return 0;
}


你可能感兴趣的:(VA - 10651 Pebble Solitaire)