首页 > 代码库 > 【UVA】10651-Pebble Solitaire(直接递归或者记忆化)
【UVA】10651-Pebble Solitaire(直接递归或者记忆化)
不知道这个题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(直接递归或者记忆化)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。