gdutcode 诺亚方舟 (dp)

http://gdutcode.sinaapp.com/problem.php?cid=1025&pid=6

诺亚方舟

Description

“终有一天,耶和华的光会普照大地,旧的世界将会毁灭,新的世界将会产生。” ——《启示录·天启》 

2096118日,世界末日终于还是来临了。

而此时,世界上最后一个“神” —— sytrakl 也已经苏醒。他按照《圣经》的指引,找到了唯一能解救人类的“诺亚方舟”,并向全世界宣布任何人都可以进入方舟避难。

所有的人类知道消息后都疯狂了,他们纷纷赶来。由于怕触怒“神”,他们老老实实的在诺亚方舟的门前排起了队(方舟在队伍的最右边)

sytrakl在英国的圣保罗大教堂沉睡了几百年,即使已经苏醒,却还保留着英国的“绅士风度”。 所以虽然方舟的体积足够大,但他还是决定让女人先行(即所有女人都在队伍右边)。于是他规定:

每一秒时间里,队伍里所有右边有男人的女人跟右边的男人调换位置。

sytrakl希望知道需要多少时间才能实现目的。然而sytrakl无所不能,但偏偏不懂编程。所以他找到了你(高兴吧!Excited!),希望你能帮他完成这个工作。

Ps:如果做不到,那你肯定药丸。

Input

 题目有多组输入。每组将给出一串长度为n的字符串(1<=n<=1000000),有两种字符,M’表示这是一个男人,W’表示这是一个女人。

Output

 输出总共需要多少时间。

Sample Input

WWMMM
WWM
MMWWW

Sample Output

420

一道dp题,第cnt个M的等待时间wait[cnt]是cnt-1个M的等待时间减去这两个M之间的W的个数再加1,求出每个cnt的等待时间加上移动的时间,找到最大的即可

即wait[cnt] = wait[cnt-1] - len + 1;

   dp[cnt] = wait[cnt] + i-(cnt-1);

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <queue>
#include <stack>
#include <vector>
#include <map>

using namespace std;
typedef long long LL;

#define N 4151000
#define INF 0x3f3f3f3f
#define PI acos (-1.0)
#define EPS 1e-5
#define met(a, b) memset (a, b, sizeof (a))

int dp[N], wait[N];
char str[N];

int main ()
{
    while (scanf ("%s", str) != EOF)
    {
        met (dp, 0);
        met (wait, 0);
        int len = 0, cnt = 0, maxn = 0;

        for (int i=0; str[i]; i++)
        {
            if (str[i]=='M')
            {
                cnt++;
                if (wait[cnt-1] - len + 1 >= 0)//如果小于0的话说明不需要等待,即wait[cnt]=0;
                    wait[cnt] = wait[cnt-1] - len + 1;

                dp[cnt] = wait[cnt] + i-(cnt-1);

                if (cnt==i+1)
                {
                    dp[cnt] = 0;
                    wait[cnt] = 0;
                }
                maxn = max (maxn, dp[cnt]);
                len = 0;
            }
            else len++;
        }

        printf ("%d\n", maxn);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_大太阳_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值