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. 【考试总结】欢乐模拟赛_Day2

    \(T1\) 题目描述 在仙界中有着 \(n\) 位神仙, 每位神仙用一个 \(1 ∼ n\) 的特异编号表示, 老祖 \(ChitongZ\) 的编号为 \(1\) . 除去至尊至圣, 统管仙界的老 ...

  2. Linux网络编程(2)

    Preview 基于上一篇博客,本文将继续展开TCP面向连接的,客户端以及服务端各自需要进行的操作,我们按照真实TCP连接的顺序,分别阐述客户端socket(), connect()以及服务端sock ...

  3. python进入adb shell交互模式

    import subprocess #方法一:进入某个环境执行语句(adb shell),注意shell内部命令需要带\n,执行完后一定记得执行exit命令退出,否则会阻塞 obj = subproc ...

  4. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

  5. Java 多线程实现方式二:实现 Runnable 接口

    由于java是单继承,很多时候为了实现多线程 通过继承 Thread 类后,就不能再继承其他类了.为了方便可以通过实现 Runnable 接口来实现,和Tread 类似需要重写run 方法. 下面通过 ...

  6. 关于小程序中textarea内的字体浮动问题

    因为map.canvas.video.textarea 是由客户端创建的原生组件,原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 原生组件暂时还无 ...

  7. gitlab环境部署

    一:配置主机名 [root@localhost ~]# hostname gitlab[root@localhost ~]# bash 二:安装依赖包 [root@gitlab ~]# yum -y ...

  8. C6 C7的开机启动流程

    C6开机启动流程 1.内核引导,加电自检(通电后检查内核):检查bios的配置,检测硬件 装好系统之后才会进行以下内容 MBR 引导 (3.2.1...) GRUB菜单 (选择不同的系统)(按e,进入 ...

  9. 【集群实战】NFS服务常见故障排查和解决方法

    NFS,全名叫Network File System,中文叫网络文件系统,是Linux.UNIX系统的分布式文件系统的一个组成部分,可实现在不同网络上共享远程文件系统. NFS由Sun公司开发,目前已 ...

  10. 【Linux常见命令】seq命令

    seq - print a sequence of numbers seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式.宽度.分割符号进行 ...