关闭

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

标签: Codeforces
274人阅读 评论(0) 收藏 举报
分类:

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;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    Dreaming
    Double Fighting
    个人资料
    • 访问:165251次
    • 积分:5884
    • 等级:
    • 排名:第4295名
    • 原创:438篇
    • 转载:2篇
    • 译文:7篇
    • 评论:22条
    最新评论