CodeForces 132C Logo Turtle 四维DP 递推

本文介绍了一种使用动态规划解决特定指令路径问题的方法。通过定义四维布尔数组表示可达状态,并利用状态转移方程进行迭代计算,最终找到经过n次变换后的最大距离。文章详细解释了状态转移过程及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

                  需要开一个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;
}


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值