HAOI2008 玩具取名
2015-09-12 18:31
281 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1055
分析:DP,写的记忆化搜索。f[i][j][k]表示区间[i,j]能否转化成k。
代码:
分析:DP,写的记忆化搜索。f[i][j][k]表示区间[i,j]能否转化成k。
代码:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int Tmax=205; int num[5],change[5][5][5],aim[Tmax],len,f[Tmax][Tmax][5]; int dp(int l,int r,int num) { int i,j,k,h; if(f[l][r][num]!=-1) return f[l][r][num]; for(i=l;i<r;i++) { for(j=1;j<=4;j++) for(k=1;k<=4;k++) if(dp(l,i,j)==1&&dp(i+1,r,k)==1) for(h=1;h<=4;h++) if(change[j][k][h]==1) f[l][r][h]=1; } if(f[l][r][num]==-1) return f[l][r][num]=0; return 1; } int get(char x) { if(x=='W') return 1; if(x=='I') return 2; if(x=='N') return 3; return 4; } void init() { int i,j; char a,b; for(j=1;j<=4;j++) for(i=1;i<=num[j];i++) { scanf("%c%c",&a,&b); change[get(a)][get(b)][j]=1; getchar(); } while(scanf("%c",&a)==1&&a!='\n') { aim[++len]=get(a); } memset(f,-1,sizeof(f)); for(i=1;i<=len;i++) f[i][i][aim[i]]=1; return; } char get2(int x) { if(x==1) return 'W'; if(x==2) return 'I'; if(x==3) return 'N'; return 'G'; } int main() { int i,ok=0; scanf("%d%d%d%d",&num[1],&num[2],&num[3],&num[4]); getchar(); init(); for(i=1;i<=4;i++) if(dp(1,len,i)==1) printf("%c",get2(i)),ok=1; if(ok==0) printf("The name is wrong!"); return 0; }
相关文章推荐
- ISCC2014 writeup
- matlab中去除矩阵中相同的行
- POJ-1528
- asp.net页面之间的传值
- hadoop MapReduce实例解析
- Java设计模式——简单工厂模式
- ZOJ-3897 Fiddlesticks
- Linux磁盘和文件系统管理--9.1作业
- 一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用
- 机器学习简单笔记
- HDOJ 2404 Permutation Recovery(好题,学习了)
- 滑动窗口的最大值
- 一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用
- python-property
- 智能手机的工业控制应用方案——SimpleWiFi在工业控制领域应用
- 离线安装openssl-devel顺序
- java开发中的23种设计模式详解
- 智能手机的工业控制应用方案——SimpleWiFi在工业控制领域应用
- CPTTRN1 - Character Patterns (Act 1)
- 一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用