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. JavaScript表达式和运算符 —— 基础语法(4)

    JavaScript基础语法(4) 运算符 运算符用于将一 个或者多个值变成结果值. 使用运算符的值称为操作数,运算符和操作数的组合称为表达式 JS中的运算符可以分成下面几类: 算术运算符 逻辑运算符 ...

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

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

  3. git .gitignore不生效

    原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方法: 1.先把规则写好,然后把规则对应的文件删了,然后 ...

  4. 动静结合?Ruby 和 Java 的基础语法比较(入门篇)

    前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...

  5. 2019-2020-1 20199326《Linux内核原理与分析》第九周作业

    进程的切换和系统的一般执行过程 中断 中断在本质上都是软件或者硬件发生了某种情形而通知处理器的行为,处理器进而停止正在运行的指令流(当前进程),对这些通知做出相应反应,即转去执行预定义的中断处理程序( ...

  6. How to check if directory exist using C++ and winAPI

    如果看文件夹是否存在,必须看返回值是不是 INVALID_FILE_ATTRIBUTES #include <windows.h> #include <string> bool ...

  7. 消息中间件之zookper安装部署

    消息中间件之zookper安装部署jdk可以在官网或者网上下载[root@q tools]# chmod 755 jdk-8u40-linux-x64.rpm [root@q tools]# rpm ...

  8. Scala教程之:静态类型

    文章目录 泛类型 型变 协变 逆变 不变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 多态方法 类型推断 Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以 ...

  9. 安装XCode7.1后,QT5.5出现的各种问题解决方案

    安装XCode7.1后,突然发现QT5.5编译不了程序了.直接在终端输入clang,竟然输出如下的信息. Agreeing to the Xcode/iOS license requires admi ...

  10. Jaba_Web--JDBC 查询记录操作模板

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...