zoukankan      html  css  js  c++  java
  • 看球的巴士【dp】

    看球的巴士【dp】

    Description

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

    input

    第一行是整数N和D,1<=N<=2500,1<=D<=N。

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

    output

    至少要几辆巴士。

    样例

    样例输入

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

    样例输出

    2
    

    题解

    一道简单的dp,阶段显然就是第几个人,用f[i]表示前i个人最少需要的巴士。从i向前遍历到j,记录两队的人数,如果符合条件,j - i 这段人就可以乘一个巴士,前i个人的巴士数也就是前j-1个人的巴士数 +1

    f[i] = min(f[i], f[j-1] + 1)

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int maxn = 3e3;
    int n, d, cnt1, cnt2, f[maxn];
    char a[maxn];
    int main(){
        scanf("%d%d", &n, &d);
    	for(int i=1; i<=n; i++) cin>>a[i], f[i] = 0x7fffffff;
    	f[0] = 0;//初始化
    	for(int i=1; i<=n; i++){
    		for(int j=i; j>=1; j--){
    			if(a[j] == 'H') cnt1 ++;
    			if(a[j] == 'J') cnt2 ++;
    			if(cnt1 == 0 || cnt2 == 0 || abs(cnt1 - cnt2) <= d)//状态合法
    				f[i] = min(f[i], f[j-1] + 1);
    		}
    		cnt1 = cnt2 = 0;//不要忘了归零
    	}
    	printf("%d
    ", f[n]);
        return 0;
    }
    
  • 相关阅读:
    asp.net mvc @RenderBody()的问题
    (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
    Spring配置错误 No adapter for IAdvice of type
    java之路 super
    java之路 static
    java之路 构造代码块注意事项
    java之路 面向对象基础
    Node.js系列02
    Node.js 系列01
    王垠:《程序员的心理疾病》
  • 原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12771719.html
Copyright © 2011-2022 走看看