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: ...
随机推荐
- ANDROID_MARS学习笔记_S02_015_Gson解析json串为对象集合
package com.example.s02_e12_json3; import java.lang.reflect.Type; import java.util.Iterator; import ...
- ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作
一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...
- 【Xamarin开发 Android 系列 13】 应用打包部署
原文:[Xamarin开发 Android 系列 13] 应用打包部署 开始倒叙咯................ 先更新大宝部署吧,这个章节比较的Easy,童鞋们不用费脑筋.点解?从界面上填写几个参 ...
- find big file
#!/bin/bash #command usage description function usage() { echo -e "Usage:nt$0 DIR_NAME" ex ...
- TC598 div2
题意:给一些物品item[],这些物品的重量在101至300之间,要将这些物品全部放进若干个bins中,已知bins盛的重量为300,可以将bins装满也可以不装满, 问放这些物品最少需要几个bins ...
- 1px
Retina屏的移动设备如何实现真正1px的线? <!DOCTYPE html> <html> <head> <meta charset="utf- ...
- 关于Azure Auto Scale的高级属性配置
Auto Sacle是一种自动化管理云服务负载的功能,系统可以根据预先制定的规则,在满足条件的情况下对计算实例的数量进行增减从而可以用来优化使用Azure的计算资源,可以适用于Cloud Servic ...
- 利用spm提供的MoAEpilot听觉数据学习预处理以及单被试glm分析与统计推断
1.数据介绍 下载:http://www.fil.ion.ucl.ac.uk/spm/data/auditory/ SUBJECT:1 VOLUME: 64*64*64 TR:7s total acq ...
- SharePoint用户控件编写的简单介绍
转:http://www.it165.net/design/html/201204/1131.html 我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickP ...
- 数学:lucas定理的总结
今天考试的题目中有大组合数取模,不会唉,丢了45分,我真是个弱鸡,现在还不会lucas. 所以今天看了一下,定理差不多是: (1)Lucas定理:p为素数,则有: 即:lucas(n,m,p)=c(n ...