看球的巴士

题目描述

两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D。有一个例外,就是一辆车上的人全部都是一个球队的支持者。问要将这N个人全部送至球场,至少要几辆巴士。
输入格式
第一行是整数N和D,1<=N<=2500,1<=D<=N。
接下来的N行,按排队的顺序,描述每个人支持的球队,用H或J表示。
输出格式
至少要几辆巴士。
样例
样例输入

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

样例输出

2
正确代码

j应倒序循环
why?
因为j为i-j的最优解
正序会先将dp[i]赋为1 再松弛也没有效果

#include<bits/stdc++.h>
using namespace std;
int n,d,dp[2505],count_H,count_J;//dp 前i人最少乘车数 
char a[2505];
int main (){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dp[i]=0x7fffffff;
	}
	for(int i=1;i<=n;i++){
		for(int j=i;j>=1;j--){
	 	if(a[j]=='H')
				count_H++; 
			if(a[j]=='J')
				count_J++;
			if(abs(count_H-count_J)<=d||count_H==0||count_J==0){//能载就载 
				dp[i]=min(dp[j-1]+1,dp[i]);
			}
		}
		count_H=0;count_J=0;
	} 
	cout<<dp[n];
	return 0;
}
大佬的另一种解法
https://www.cnblogs.com/shawk/p/13178993.html
正序只能输出1
点击查看错误代码
#include<bits/stdc++.h>
using namespace std;
int n,d,dp[2505],count_H,count_J;//dp 前i人最少乘车数 
char a[2505];
int main (){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dp[i]=0x7fffffff;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			if(a[j]=='H')
				count_H++; 
			if(a[j]=='J')
				count_J++;
			if(abs(count_H-count_J)<=d||count_H==0||count_J==0){//能载就载 
				dp[i]=min(dp[j-1]+1,dp[i]);
			}
		}
		count_H=0;count_J=0;
	} 
	cout<<dp[n];
	return 0;
}
posted @ 2021-12-25 21:01  2T_WANG  阅读(29)  评论(0编辑  收藏  举报