看球的巴士 線性dp

2022-03-19 19:34:46 字數 1098 閱讀 9324

【題目描述】

兩個球隊的支持者要一起坐車去看球,他們已經排成了一列。我們要讓他們分乘若干輛巴士,同一輛巴士上的人必須在隊伍中是連續的。為了在車上不起衝突,希望兩隊的支持者人數盡量相等,差至多是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的時代,可惜我那時無法...