CodeForces 132C Logo Turtle 四维DP 递推

来源:互联网 发布:阿里云 域名解析到网址 编辑:程序博客网 时间:2024/04/30 19:02

                  好吧,这道题目居然是动态规划。。涨姿势了。。。原来也可以这样设置状态。。

                  需要开一个bool数组来表示这个状态是不是可以到达,最后在所有状态里面遍历一遍,取最大的。

                  arr[i][j][k][l]表示执行到i条指令离坐标j变换了k条指令方向为l的状态可不可达(l表示方向,0表示和原点相同,1表示相反)

                  因为从原点可以往两边走,所以把原点设在坐标为100的地方了,所以一开始是arr[0][0][100][0]=true。

                 状态转移方程: if str[i] is 'T' 

                                                               if arr[i][j][k][l^1] is true -> arr[i][j][k][l] := true

                                                               if k>0&&arr[i-1][j+(l==0?-1:1)][k-1][l] -> arr[i][j][k][l] := true //此处在考虑把T变换成F,同时需要考虑到方向的问题

                 str[i]是F的情况在此不予列出,自己动手推一下很快的。

                 最后就是题目要求的变换n次时候的最大值,但是仔细想一下,这个变换变两次之后又回来了,因此可以通过这个来故意浪费变换次数,要注意的应该就这些了

                 挺不错的一道题目。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char str[110];int n,ans,len;bool arr[110][220][55][2];int main(){    scanf("%s%d",str+1,&n);    len=strlen(str+1);    arr[0][100][0][0]=true;    for(int i=1;str[i];++i)    for(int j=100-i;j<=100+i;++j)    for(int k=0;k<=i&&k<=n;++k)    for(int l=0;l<=1;++l){        if(str[i]=='T'){            if(arr[i-1][j][k][l^1])                arr[i][j][k][l]=true;            if(k>0&&(arr[i-1][j+((l==0)?-1:1)][k-1][l]))                arr[i][j][k][l]=true;        }        else{            if(arr[i-1][j+((l==0)?-1:1)][k][l])                arr[i][j][k][l]=true;            if(k>0&&arr[i-1][j][k-1][l^1])                arr[i][j][k][l]=true;        }    }    for(int j=100-len;j<=100+len;++j)    for(int k=n;k>=0;k-=2)    for(int l=0;l<=1;++l)    if(arr[len][j][k][l])    ans=max(ans,abs(100-j));    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击