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. The Super Powers UVA - 11752

    题目大意:将范围从1~pow(2,64)-1内的super power输出.super power的定义:一个数x至少存在两种x=pow(i,k),(k!=1). 题解: 注意数据范围2的64次方-1 ...

  2. G. 大树的水塘

    已知每块石头中的规格是1×1×1,水塘的长度为N,宽度为1,在第i位置,大树放了ai个石头 设大树建造的水塘蓄水量为V 请你求出在长度和宽度不变的情况下,建造一个蓄水量不小于V的水塘最多可以节约多少石 ...

  3. python基础-json、pickle模块

    json.pickle区别 总结: """ json: 1.不是所有的数据类型否可以序列化,序列化返回结果为字符串 2.不能多次对同一文件序列化 3.json数据可以跨语 ...

  4. el-tab-pane label的文字内容怎样设间距

    el-tab-pane label的文字内容怎样设间距 问题描述: 在使用element-ui的el-tab-pane做标签页时,label属性的位置与样式不能通过style样式直接解决 百度后几乎没 ...

  5. vs 类型定义及语句,随机数

    1  类型定义: 1)小数: 类型         变量名           赋值 decimal       d   :              d=1.2m float             ...

  6. 图解Knative核心组件Serving基础设计

    最近闲下来,打算把Knative的核心组件Serving给学习下,会继续采用k8s源码学习的方式,管中窥豹以小击大,学习serving的主要目标: 可观测性基础设施.自动伸缩.流量管理等核心组件的设计 ...

  7. MVC-基础02

    MVC是Model(模型).View(视图)和Controller(控制). 1)最上面的一层,是直接面向最终用户的"视图层"(View).它是提供给用户的操作界面,是程序的外壳. ...

  8. 一篇文章掌握网页解析神器——xpath

    学爬虫不会xpath解析数据? 今天老师带你一堂课带你从零开始精通xpath,从此轻松提取网页信息. 我们在爬虫的过程中,经常会遇到html字符串数据,很多我们需要的数据不是作为标签的文本就是作标签的 ...

  9. Win10桌面美化

    捯饬了几个小时终于捯饬好了,没什么特效,就是看起来干净了许多. 用到的小软件: 链接:https://pan.baidu.com/s/1_PSTn0JZ22ZGiMDOdvdWEw提取码:329c 1 ...

  10. <cstring>中常用的两个函数memset()和memcpy()

    <cstring>是c++对c中的<string.h>进行了重写,这两个头文件中的函数用法是一样的,所以在用的时候包含哪个头文件都行.下面介绍一下 <cstring> ...