标签:style blog http color os io ar for 数据
不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!?
直接郁闷了,简单的二进制表示状态和二进制运算。
14145176 | 10651 | Pebble Solitaire | Accepted | C++ | 0.009 | 2014-09-04 09:18:21 |
#include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<map> #include<iostream> using namespace std; #define MAXD 20 const int MAX_SIZE = 1 << 13; const int INF = 20; int dp[MAX_SIZE]; int DP(int state){ if(dp[state] != -1) return dp[state]; dp[state] = 0; for(int i = 0 ; i < 12 ; i++)if(state & (1 << i)) dp[state] ++; for(int i = 0 ; i < 12 ; i++){ if(i > 1){ if((state & (1 << i)) && (state & (1 << (i - 1))) && !(state & (1 << (i - 2)))){ int u = state; //把第i - 2 位 从 0 变成 1,把第 i - 1 和 第 i 位 从 1 变成 0 u = u & (~(1 << i)); u = u & (~(1 << (i - 1))); u = u | (1 << (i - 2)); dp[state] = min(dp[state],DP(u)); } } if(i < 10){ if((state & (1 << i)) && (state & (1 << (i + 1))) && !(state & (1 << (i + 2)))){ int u = state; //把第i - 2 位 从 0 变成 1,把第 i - 1 和 第 i 位 从 1 变成 0 u = u & (~(1 << i)); u = u & (~(1 << (i + 1))); u = u | (1 << (i + 2)); dp[state] = min(dp[state],DP(u)); } } } return dp[state]; } int main(){ int T; int n; memset(dp,-1,sizeof(dp)); scanf("%d",&T); while(T--){ char str[MAXD]; scanf("%s",str); n = 0; for(int i = 0 ; i < strlen(str) ; i++){ if(str[i] == 'o') n = n | (1 << i); } int ans = DP(n); printf("%d\n",ans); } return 0; }
【UVA】10651-Pebble Solitaire(直接递归或者记忆化)
标签:style blog http color os io ar for 数据
原文地址:http://blog.csdn.net/u013451221/article/details/39055517