codeforces 132C Logo Turtle(dp)
可以用三维dp来保存状态, dp[i][j][k]表示在前i个字符变换了j步之后方向为k(k = 1 or k = 0)的最优解,也就是离原点的最大距离。这里规定0方向为正方向,1位负方向,表示的是当前这个人朝哪个方向。这两个方向是对立的。
所以就可以递推一个关系式,分第i个字符为'F' or 'T'时
如果为'F'
依次枚举在第i个位置变换了几步,这是枚举的范围为0~j, 假设变换了k步(和上面的dp[i][j][k]当中的k不是一个)
1. 如果当k为奇数的时候,就是相当于变化了1步,所以'F'就变成'T'了,那么他的方向也因此变化了。所以当前的方向一定和上一步(也就是i - 1时的方向)的方向相反,所以有dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]), 同理,dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0])
2.如果k为偶数,相当于没有变化,所以还是字符'F',如果是正方向,那么他就可以由上一步继续向正方向走一步,也就是加1, 如果是负方向,相当于往回走一步,距离就减1,递推方程为dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1); dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1);
如果为'T'
依次枚举在第i个位置变化了几步,范围也是0~j,假设变换k步
1.如果k为奇数,这时就变化成了'F',所以dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][0] + 1); dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][1] - 1)
2.如果k为偶数,这时还是'T',所以dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k][1]); dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k][0])
其中还有一个问题就是和刚开始的方向的无关,不用管朝哪个方向,只要走的最远的就行了,而且始终有两个相互对立的方向。初始化的时候dp[0][0][0]和dp[0][0][1]都得初始化0,这样才可以往哪走都可以
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = ;
int dp[maxn][maxn][];
const int inf = 0x3f3f3f3f;
int main()
{
//freopen("in.txt", "r", stdin);
char cmd[maxn];
scanf("%s", cmd + );
int n;
scanf("%d", &n);
int len = strlen(cmd + );
//memset(dp, -inf, sizeof(dp));
for (int i = ; i <= len; i++)
for (int j = ; j <= n; j++) dp[i][j][] = dp[i][j][] = -inf;
dp[][][] = ;//正方向
dp[][][] = ;//负方向,两边都可以走
for (int i = ; i <= len; i++)
{
for (int j = ; j <= n; j++)
{
for (int k = ; k <= j; k++)
{
if (cmd[i] == 'F')
{
if (k & )
{
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][]);
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][]);
}
else
{
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][] + );
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][] - );
}
}
else
{ if (k & )
{
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][] + );
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][] - );
}
else
{
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][]);
dp[i][j][] = max(dp[i][j][], dp[i - ][j - k][]);
}
}
} } }
printf("%d\n", max(dp[len][n][], dp[len][n][]));
return ;
}
codeforces 132C Logo Turtle(dp)的更多相关文章
- CodeForces 132C Logo Turtle (记忆化搜索)
Description A lot of people associate Logo programming language with turtle graphics. In this case t ...
- 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 ...
- 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 ...
- CF#132 C. Logo Turtle DP
C. Logo Turtle 题意 有一个海龟在一个x轴的0点,给出一个由'F','T'组成的字符序列. 海龟要按照这个序列进行行动,如果第i个字符为'F',表示沿当前方向走,'T'表示转身. 现在你 ...
- Codeforces Beta Round #96 (Div. 2) E. Logo Turtle dp
http://codeforces.com/contest/133/problem/E 题目就是给定一段序列,要求那个乌龟要走完整段序列,其中T就是掉头,F就是向前一步,然后开始在原点,起始方向随意, ...
- codeforces 132C Logo Turtle--- dp dfs
题目在这里:点击打开链接 题意: F表示前进一步,T表示变成反方向 给一串FT字符,和一个n,表示可以改变多少次,求可以走到的离原点最远的距离 改变就是F变成T.T变成F 关键: dfs(int d, ...
- [CF132C] Logo Turtle
[CF132C] Logo Turtle , Luogu A turtle moves following by logos.(length is \(N\)) \(F\) means "m ...
- [Codeforces 1201D]Treasure Hunting(DP)
[Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...
- codeforces Hill Number 数位dp
http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits: 5000 MS Memory Limits: ...
随机推荐
- [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...
- 只看Delphi自带的WnAPI帮助似乎不够
比如,MessageBox在Delphi自带帮助的参数说明中,对其第四个参数的MB_类型说明只有最常见的6种类型,这么多年搞得我天经地义的以为MessageBox就是这么简单.今天看了一位前辈写的老代 ...
- C#下多进程共同读写同一文件
最近遇到这样一个需求,用C#写一个界面,在界面上实时输出一个日志文件. 实时检测文件变化,以便刷新界面显示,可以用FileSystemWatcher组件,响应Changed事件即可. 关键是在Chan ...
- (转载)struct 与typdef struct的区别
(转载)http://blog.csdn.net/piratejk/article/details/3491226 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字. ...
- [hadoop转载]tearsort
1TB排序通常用于衡量分布式数据处理框架的数据处理能力.Terasort是Hadoop中的的一个排序作业,在2008年,Hadoop在1TB排序基准评估中赢得第一名,耗时209秒.那么Tera ...
- 批处理at命令--一切尽在计划中
让计算机在自己规定的时间里干自己规定的事,一切尽在计划之中.所以at命令你一定不能错过. 概述 列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序,以及设置在指定时间和日期在计算机上运行 ...
- 1 storm基本概念 + storm编程规范及demo编写
本博文的主要内容有 .Storm的单机模式安装 .Storm的分布式安装(3节点) .No space left on device .storm工程的eclipse的java编写 http:// ...
- PC-修改IE 与 禁止修改IE
1.注册表编辑器1.1在Windows启动后1.2点击“开始”1.3“运行”菜单项1.4在“打开”栏中键入“regedit”1.5然后按“确定”键 2.首页项2.1展开注册表到“HKEY_LOCAL_ ...
- linq 学习笔记(一)
First: 找到符合条件的第一记录,就返回了,不管后面还有多少数据. Single: 先将记录都梳理一次,再找到符合要求的唯一记录. Single():操作一个集合,同时强要求只有一个对象匹配, ...
- 2016-5-19模拟测试 bzoj3652 bzoj3653 bzoj3654
T1 description 给定正整数\(n\),定义\(f(x) = \max{y \ \mathrm{xor}\ x}(y<n)\) \(x\)在\([0,n)\)随机取值,求\(f(x) ...