【題目描述】
兩個球隊的支持者要一起坐車去看球,他們已經排成了一列。我們要讓他們分乘若干輛巴士,同一輛巴士上的人必須在隊伍中是連續的。為了在車上不起衝突,希望兩隊的支持者人數盡量相等,差至多是d。有乙個例外,就是一輛車上的人全部都是乙個球隊的支持者。問要將這n個人全部送至球場,至少要幾輛巴士。
輸入格式
第一行是整數n和d,1<=n<=2500,1<=d<=n。
接下來的n行,按排隊的順序,描述每個人支援的球隊,用h或j表示。
輸出格式
至少要幾輛巴士。
樣例樣例輸入
14 3hj
hhhj
hjhh
hhhh
樣例輸出
2
【思路分析】說實話一開始看見這道題覺得是區間dp,but……這就很尷尬了
1.整個大巴上都是同乙個球隊的球迷,那顯然(j,i)區間的長度,就是h陣列或j陣列在這個區間內的個數:
合法條件為:h[j] - h[i-1] == j-i+1 || j[j] - j[i-1] == j-i+1
2.大巴上有兩個球隊的球迷,那在(i,j)區間內兩個陣列的差值就要小於等於d:
合法條件為:abs(j[j]-j[i-1]-(h[j]-h[i-1])) <= d
細節見**注釋
【**】
#include#include#include
using
namespace
std;
const
int n = 2500+10
;int
n,d;
intf[n],h[n],j[n],v[n][n];
intmain()
else
f[i] =i;
}for(int i = 1;i <= n;i++)}}
for(int i = 1;i <= n;i++)
}printf("%d
",f[n]);
return0;
}
看球的巴士(vijos1331)
演算法 dp 挺簡單的,但是一開始卻想成了區間dp program vijos1331 const maxn 2500 var n,m longint a array 0.maxn of char f array 0.maxn of longint procedure init var i long...
看球的歷史
看球的歷史 首先需要指出的是,題目中的球是指足球。昨晚和一些哥們看了一下德甲,使我不禁勾起對以前看球的一些回憶。嚴格說來,踢球始於初中,看球始於高中。記憶中開始看電視時 上個世紀 80年代 很討厭看到兩樣東西 足球 那時廣東體育頻道好像正在轉播英超 f1賽車 那時正是塞納統治 f1的時代,可惜我那時...
看球的歷史
看球的歷史 首先需要指出的是,題目中的球是指足球。昨晚和一些哥們看了一下德甲,使我不禁勾起對以前看球的一些回憶。嚴格說來,踢球始於初中,看球始於高中。記憶中開始看電視時 上個世紀80年代 很討厭看到兩樣東西 足球 那時廣東體育頻道好像正在轉播英超 f1賽車 那時正是塞納統治f1的時代,可惜我那時無法...