C. Logo Turtle

题意

有一个海龟在一个x轴的0点,给出一个由'F','T'组成的字符序列。

海龟要按照这个序列进行行动,如果第i个字符为'F',表示沿当前方向走,'T'表示转身。

现在你必须改变n个操作,把'F'变成'T',或者把'T'变成'F',同一个操作可以改变多次,问终点距离起点最大距离。

思路

看数据范围就是DP。

先说正解。

dp[i][j][0]表示执行完前i步,改变了j次,方向为正对起点的最大距离

dp[i][j][1]表示执行完前i步,改变了j次,方向为背对起点的最大距离

对于每个操作,枚举改变的次数num,然后分别讨论为F,T的情况

str[i]=='F':

  1. num%2==0 :改变偶数次相当于没改变,向前走了一步

    dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-num][0]-1);正对起点向前走,距离减小1

    dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-num][0]+1);与上相反

  2. num%2==1:改变奇数次相当于改变一次,转身

    dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-num][1]);

    dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-num][0]);

str[i]=='T': 就和F中num的奇偶性相反

初始化dp[0][0][0]=dp[0][0][1]=0.,其他为负无穷

这题我想了两个DP方程,上面是第二个。

第一个是dp[i][j][k][l]表示前i个命令距离起点为j改变了k次朝向为l是否可行

GG了,写了好久混乱了

代码

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e4+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f; int dp[110][110][55];
/*
dp[i][j][k]前i条命令改变了j次,朝向为k的最远距离
*/
char str[N];
int main()
{
scanf("%s",str+1);
int len=strlen(str+1),k;
scanf("%d",&k);
memset(dp,0x8f,sizeof(dp));
dp[0][0][1]=0;
dp[0][0][0]=0;
for(int i=1; i<=len; i++)
{
for(int j=0; j<=k; j++)
{
for(int l=0; l<=j; l++)
{
if(str[i]=='F')
{
if(l%2)
{
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][1]);
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][0]);
}
else
{
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][1]+1);
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][0]-1);
} }
else
{
if(l%2==0)
{
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][1]);
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][0]);
}
else
{
dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-l][1]+1);
dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-l][0]-1);
}
}
}
}
}
printf("%d\n",max(dp[len][k][0],dp[len][k][1]));
return 0;
}

博客

CF#132 C. Logo Turtle DP的更多相关文章

  1. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle —— DP

    题目链接:http://codeforces.com/contest/132/problem/C C. Logo Turtle time limit per test 2 seconds memory ...

  2. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP

    C. Logo Turtle   A lot of people associate Logo programming language with turtle graphics. In this c ...

  3. codeforces 132C Logo Turtle(dp)

    可以用三维dp来保存状态, dp[i][j][k]表示在前i个字符变换了j步之后方向为k(k = 1 or k = 0)的最优解,也就是离原点的最大距离.这里规定0方向为正方向,1位负方向,表示的是当 ...

  4. Codeforces Beta Round #96 (Div. 2) E. Logo Turtle dp

    http://codeforces.com/contest/133/problem/E 题目就是给定一段序列,要求那个乌龟要走完整段序列,其中T就是掉头,F就是向前一步,然后开始在原点,起始方向随意, ...

  5. [CF132C] Logo Turtle

    [CF132C] Logo Turtle , Luogu A turtle moves following by logos.(length is \(N\)) \(F\) means "m ...

  6. CF 983B XOR-pyramid(区间dp,异或)

    CF 983B XOR-pyramid(区间dp,异或) 若有一个长度为m的数组b,定义函数f为: \(f(b) = \begin{cases} b[1] & \quad \text{if } ...

  7. CodeForces 132C Logo Turtle (记忆化搜索)

    Description A lot of people associate Logo programming language with turtle graphics. In this case t ...

  8. CF 9D. How many trees?(dp)

    题目链接 以前做过类似的,USACO,2.3,开始数组开小了,导致数据乱了,然后超数据范围了,.. #include <cstdio> #include <iostream> ...

  9. CF 346B. Lucky Common Subsequence(DP+KMP)

    这题确实很棒..又是无想法..其实是AC自动机+DP的感觉,但是只有一个串,用kmp就行了. dp[i][j][k],k代表前缀为virus[k]的状态,len表示其他所有状态串,处理出Ac[len] ...

随机推荐

  1. S7通信协议之你不知道的事儿

    在电气学习的路上,西门子PLC应该是我的启蒙PLC,从早期的S7-300/400 PLC搭建Profibus-DP网络开始接触,到后来的S7-200Smart PLC,再到现在的S7-1200/150 ...

  2. cmd 文件/文件夹的一切操作

    dir // 列出目录下所有文件夹 rd dirname // 删除dirname文件夹(空文件夹) rd /s/q dirname // 删除dirname文件夹(非空)

  3. 【启蒙】C笔记之初学阶段(下篇)

    下篇继续点赞,谢谢老铁,不存在下次一定的哈! c语言简单判断质数的方法 int isprime(int a){ ) ; ==||a==||a==) ; else { ;i<=sqrt(a);i+ ...

  4. C#客户端打印条形码

    第一种方法: 引用第三方插件文件zxing.dll // 1.设置条形码规格 EncodingOptions encodeOption = new EncodingOptions(); encodeO ...

  5. 负载均衡服务之HAProxy基础配置(四)

    前文我们聊了haproxy的状态页配置,状态页中显示各参数的含义,以及基于cookie做会话保持的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12776 ...

  6. 初学者的Pygame安装教程

    最近在自学python,在看完了些基础知识之后,准备写个小项目[外星人入侵],这个项目需要安装pygame. 所以就在网上找到了两个下载地址https://bitbucket.org/pygame/p ...

  7. git、gitLab、github区别

    git是一种版本控制系统,是一个命令.一种工具 gitlib是用于实现git功能的开发库 github是一个基于git实现的在线代码仓库,是一个网站,支持几乎所有git操作,可用于托管代码 gitla ...

  8. python 开发一款图片压缩工具(四):上传图床

    上一篇使用了 pngquant 图片压缩工具进行压缩,并通过 click 命令行工具构建了 picom 包.这篇的主要功能是实现图片上传. 图片上传功能的实现 通过 pngquant 压缩图片后,得到 ...

  9. 安装 wbemcli

    安装环境        建立自己的目录后,             wget http://vault.centos.org/6.0/os/x86_64/Packages/sblim-wbemcli- ...

  10. Android混淆配置及总结

    Android打正式的release包混淆是必备的,避免APP被反编译,使项目中隐秘的技术或信息被别人查看. Android studio则写在proguard-rules.pro中,当然写在prog ...