Codeforces Beta Round #96 (Div. 1) C. Logo Turtle (DP)

原创 2015年07月10日 14:57:02

http://codeforces.com/problemset/problem/132/C

题意:给出一段指令序列,F为直走,T为向后转。改变指令n次,求出离起点最远的距离,一个指令可以改变多次。

思路:

dp【i】【j】【k】:执行i个指令后改变j次方向为k 的最远距离。

由于最远距离可以有两个方向,则应该求两次,一次是正方向的最远(正向-反向),一次是负方向的最远(反向-正向)。

*虽然说每一个dp状态有多个实际位置,但是每次都是保存离起点最远的距离,所以也就无所谓了~

AC.

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
char s[105];
int dp[105][105][2];

int cal(int a, int b, int n, int len)
{
    int ans = -0x3f;
    memset(dp, -0x3f, sizeof(dp));
//    for(int i = 0; i <= n; ++i)
//        dp[0][i][1] = 0, dp[0][i][0] = 0;
    dp[0][0][1] = 0;
    for(int i = 1; i <= len; ++i) {
        for(int j = 0; j <= n; ++j) {
            for(int k = 0; k <= j; ++k) {
                if(s[i] == 'F') {
                    if((j-k)%2 == 0) { //F
                        dp[i][j][1] = max(dp[i][j][1], dp[i-1][k][1]+a);
                        dp[i][j][0] = max(dp[i][j][0],dp[i-1][k][0]+b);
                    }
                    else { //T
                        dp[i][j][1] = max(dp[i][j][1], dp[i-1][k][0]);
                        dp[i][j][0] = max(dp[i][j][0], dp[i-1][k][1]);
                    }
                }

                else {
                    if((j-k)%2 == 0) { //T
                        dp[i][j][1] = max(dp[i][j][1], dp[i-1][k][0]);
                        dp[i][j][0] = max(dp[i][j][0], dp[i-1][k][1]);
                    }
                    else {//F
                        dp[i][j][0] = max(dp[i][j][0], dp[i-1][k][0]+b);
                        dp[i][j][1] = max(dp[i][j][1], dp[i-1][k][1]+a);
                    }
                }
            }

        }
    }
    ans = max(dp[len][n][0], dp[len][n][1]);
    return ans;
}
int main()
{
    //freopen("in", "r", stdin);
    int n;
    while(~scanf("%s", s+1)) {
        scanf("%d", &n);
        int len = strlen(s+1);
        int ans1 = cal(1, -1, n, len);
        int ans2 = cal(-1, 1, n, len);
        int ans = max(ans1, ans2);
        printf("%d\n", ans);
    }
    return 0;
}



相关文章推荐

Codeforces Beta Round #96 (Div. 2)

C. Turing Tape time limit per test 2 seconds memory limit per test 256 megabytes in...
  • Tsaid
  • Tsaid
  • 2011年12月06日 22:53
  • 626

Codeforces Beta Round #96 (Div. 2) (模拟)

D. Piet time limit per test 2 seconds memory limit per test 256 megabytes input st...
  • Tsaid
  • Tsaid
  • 2011年12月06日 22:56
  • 436

Codeforces 132C.Logo Turtle【DP,dfs】

题目大意: 在一根数轴上有一只机器龟,它能够听从人们给它的指令做出向前走一步(F)和向后转(T)的操作。给出初始操作,你最开始有修改n步指令的权利(每一个指令可以被修改很多次),问在你修改n次之后,海...

CodeForces 132C Logo Turtle 四维DP 递推

好吧,这道题目居然是动态规划。。涨姿势了。。。原来也可以这样设置状态。。                   需要开一个bool数组来表示这个状态是不是可以到达,最后在所有状态里面遍历一遍,取最大的...

【Codeforces Round 374 (Div 2)C】【DAG上的DP】Journey 有向无环图从1到n时刻T内的最多经过点数

C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input ...

Codeforces Round #360 (Div. 1) C. The Values You Can Make(DP)

题目链接:点击打开链接 思路: 用d[i][j][k]表示, 前i个数, 选取的数之和为j, 再次选取的数之和为k的种类数。  那么当这种情况存在时, 我们把此时的k保存即可。 细节参见代码: ...

Codeforces Round #248 (Div. 1)C(AC自动机+DP)

C. Tachibana Kanade's Tofu time limit per test 5 seconds memory limit per test 512 megabytes i...
  • cq_phqg
  • cq_phqg
  • 2015年03月12日 20:37
  • 548

Codeforces Beta Round #69 (Div. 2 Only) E树型DP 一树,每个结点有虫子,一次只能吃一只,不能停留,问从根结点出发再回到根结点最多能吃多少只虫子

/* 题意:一树,每个结点有虫子,一次只能吃一只, 不能停留,问从根结点出发再回到根结点最多能吃多少只虫子 思想:记录从某个结点出发再回到该结点最多能吃的虫子,然后 由将子结点按能...

Codeforces Beta Round #95 (Div. 2) A B C E

哎,心血来潮想做CF,大晚上去买了根网线(被坑了= =#),晚上在寝室客厅做。第一次这么认真滴做,Q都木有上,整整做了俩小时。。。D题木有看,E题挂掉了,rating涨了20+才。。。桑心。 ...

Codeforces Beta Round div.2 #228 A B C D E

Codeforces Beta Round #228 A B C D E
  • hcbbt
  • hcbbt
  • 2014年02月04日 23:10
  • 1876
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Beta Round #96 (Div. 1) C. Logo Turtle (DP)
举报原因:
原因补充:

(最多只允许输入30个字)