有高為 1, 2, …, n 的 n 根桿子排成一排, 從左向右能看到 l 根, 從右向左能看到 r 根。求有多少種可能的排列方式。
資料範圍僅200,本來是往組合數學方面想的,看到了這個200就放棄了念頭,果然是dp
定義dp[i][j][k]是用了高度為1~i的桿子,從左邊能看到j個,從右邊能看到k個
如果從1轉移到n很困難,因為放乙個高的桿子進去會造成很多的遮擋影響,是幾乎不能維護的。於是考慮從n轉移到1,即先放比較高的桿子
加上放好了2~n高度的桿子,再放高度為1的桿子僅有三種情況
1.放在最左邊。僅僅是從左看能多看到乙個 dp[i][j][k]+=dp[i-1][j-1][k]
2.放在最右邊,同理
3.放在中間,一定會被擋住。i-1根桿子間有(i-2)個可以放置的空格,則dp[i][j][k]+=dp[i-1][j][k]*(i-2)。
其實這裡i的定義已經發生了一點變化,但是狀態轉移是很容易理解的
為什麼可以把i等效定義為i個,而不是1~i呢?其實這只需要代表是i根高度不同的桿子,2~i的桿子全部砍1,相對高度沒有變,也就等效成了1~i-1的桿子
#includeusingnamespace
std;
#define mod 998244353
#define ll long long
#define n 220ll dp[n][n][n];
ll t,n,l,r;
intmain()
return0;
}
vijos P1638 搶救檔案
發現這個題庫裡面的題目理解起來好費勁。這個算是乙個二維lis吧。vojis p1638搶救檔案 題意 通道大小為x 長 y 寬 應該是資料原因,這個x,y好像並沒有什麼用,應該是用來判別 陷阱是否超出通道,好像資料都沒有超出。有n個陷阱,陷阱的d,c分別為陷阱所在的座標系的位置 把通道看出座標系,則...
拔河遊戲 SSL 1638
description 乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。input 輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的...
SSL 1638 拔河比賽
乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須 且只能夠 在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入資料的第1行是乙個n,表示參加拔河比賽的總人數,n 100,接下來的n行表示第1到第n個人的體重,每個人的體重都是整數 1 weight 45...