解题报告 Valentine‘s seat
?
1.??????? 題目
1.Valentine’s Seat(seat)
描述
今天是情人節的前一天,小杉還在電影院打工(慘啊…)。
老板很懂得情人節的情調,要小杉提前做好準備,那么現在給小杉的任務是對電影院的座椅上色。
電影院總共n+1行m+1列的椅子排成一個矩陣。第一行的椅子已經全部上了粉紅色,第一列從第二個開始的椅子已經全部上了天藍色。
一個可愛的上色方案應該滿足除了第一行第一列以外,對任意的一個椅子,它的顏色應當和它左邊的一把椅子(同行)或上面的一把椅子(同列)顏色相同。
小杉現在想知道總共有多少種可愛的上色方案。
輸入格式
一行兩個整數n,m(1<=n,m<=3000)
輸出格式
僅有一行,一個整數,為上色方案數對19900801取模的結果
樣例輸入
1 1
樣例輸出
2
樣例解釋
唯一可上色的一把椅子,不是粉紅就是天藍,怎樣都是可愛的
?
2.??????? 題目實質
求一種特殊的 01 矩陣。
3.??????? 算法
遞推,其實這也是一個數學題。
抽象出模型,就是01矩陣的問題,問題即為求最上一行全是1,最左一列全是0的01矩陣,任意一個元素與其前趨或上繼相同的情況數。而這種情況等價于任意一行的0的個數大于等于上一行的0的個數(假如比上一行少的話,上一行多出的0的下繼為1,這個1不滿足題意)。
接下來就很簡單了,我們令f[n,k]為第n+1行有k+1個0的情況,則
f[n,k]=sum{f[n-1,j]}(j=1..k)
簡單變換得
f[n,k]=f[n-1,k]+f[n,k-1]
初始狀態為f[0,0]=1,結果為f[n,m] (f[n,m]=sum{f[n-1,j]}(j=1..m))
空間限制的問題,使用滾動數組可以解決。
其實仔細觀察的話,會發現結果就是C(n+m,n)
注意 n=0 (第 0 行) ,或是 k=0 (這一行這有最邊上那一個零) 時 ,f=1 。
?
4.??????? 注意事項
話說這個題我的式子推對了,初始化打錯了 XD 。
所以,注意初始化啊啊。
5.??????? 時空復雜度
O(n,m)
6.??????? 程序代碼
LZY(std)? (pascal)
const
?k=19900801;
var
?a:array[0..3000,0..3000]of longint;
?n,m:longint;
?i,j:longint;
?
begin
assign(input,'seat.in');reset(input);
assign(output,'seat.out');rewrite(output);
readln(n,m);
for i:=1 to n do a[i,0]:=1;
for i:=1 to m do a[0,i]:=1;?? //此處第一行為第 0 行
?
for i:=1 to n do begin
?for j:=1 to m do begin
? a[i,j]:=(a[i-1,j]+a[i,j-1])mod k;
?end;
end;
?
if(a[n,m]<0)then writeln(a[n,m]+k) else writeln(a[n,m]);? //防止 mod 過頭
close(input);
close(output);
end.
轉載于:https://www.cnblogs.com/SueMiller/archive/2011/08/09/2132317.html
總結
以上是生活随笔為你收集整理的解题报告 Valentine‘s seat的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery实现饼图统计图表
- 下一篇: 解题报告 Number