zoukankan      html  css  js  c++  java
  • 看球的巴士——线性DP

    题目描述

    两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D。有一个例外,就是一辆车上的人全部都是一个球队的支持者。问要将这N个人全部送至球场,至少要几辆巴士。

    输入格式

    第一行是整数(N)(D)(1leq Nleq 2500)(1leq Dleq N)

    接下来的(N)行,按排队的顺序,描述每个人支持的球队,用(H)(J)表示。

    输出格式

    至少要几辆巴士。

    样例

    样例输入

    14 3
    H
    J
    H
    H
    H
    J
    H
    J
    H
    H
    H
    H
    H
    H
    

    样例输出

    2
    

    题解

    解题思路

    一道简单的DP。

    设状态(f_i)为前(i)个人最少乘坐几辆车

    一辆车中符合题目要求的有两种坐法

    • 车里两队的人数差 < D

    • 车里只有一队的人

    那就让满足这样条件的人坐一辆车

    (f_i = min(f_i, f_{j-1} + 1);)

    代码

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N = 2505;
    int n, d, s[N], f[N];
    int main() {
        memset(f, 0x3f, sizeof(f));
        f[0] = 0;
        scanf("%d%d", &n, &d);
        for(int i = 1; i <= n; i++) {
            char c;
            scanf(" %c", &c);
            if (c == 'H') s[i] = s[i-1] + 1;
            else s[i] = s[i-1] - 1;
            //s[i]是前i个人中H队与J队的人数差,用了前缀和的思想
        }
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                if (abs(s[i] - s[j-1]) == i-j+1 || abs(s[i] - s[j-1]) <= d)
                //这里就是提到的两个条件
                    f[i] = min(f[i], f[j-1] + 1);
        printf("%d
    ", f[n]);
        return 0;
    }
    
  • 相关阅读:
    Oracle忘记用户名和密码以及管理员用户新增修改删除用户
    Oracle11.2安装和完全卸载及卸载后重装等问题
    软件测试之路2
    软件测试之路1
    Git入门笔记
    CentOS 6.5下二进制安装 MySQL 5.6
    十款压力测试工具
    tomcat 内存设置
    tomcat 安全
    tomcat 模式详解
  • 原文地址:https://www.cnblogs.com/shawk/p/13178993.html
Copyright © 2011-2022 走看看