[bzoj1019]:[SHOI2008]汉诺塔

来源:互联网 发布:软件无线电 军用 编辑:程序博客网 时间:2024/05/22 06:20

传送门
我只能说,乍一看题解好简单,结果看了一个多小时。。
就是f[x][i]代表从x到g[x][i]的最小步数
然后dp
具体的我不会讲
可以看这个,这个有图:
http://blog.163.com/suicidal_tomato/blog/static/2344980402014918104434888/
代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inline int read(){    int x=0;char ch=' ';int f=1;    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();    return x*f;}ll n,f[4][31],g[4][31];int main(){    n=read();    for(int i=1;i<=6;i++){        char ch[4];        scanf("%s",ch);        int a=ch[0]-'A'+1,b=ch[1]-'A'+1;        if(!g[a][1])g[a][1]=b;    }    for(int i=1;i<=3;i++)f[i][1]=1;    for(int i=2;i<=n;i++)        for(int a=1;a<=3;a++){            int b=g[a][i-1],c=6-a-b;            if(g[b][i-1]==c)f[a][i]=f[a][i-1]+1+f[b][i-1],g[a][i]=c;            else f[a][i]=f[a][i-1]+1+f[b][i-1]+1+f[a][i-1],g[a][i]=b;        }    printf("%lld",f[1][n]);    return 0;}
原创粉丝点击