看球的巴士
题目描述
两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是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;
}