給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10^17的值。
第一行包含四個正整數n,c1, c2, c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。1<=n<=200
抓住題目的資料範圍n<=200,每行每列之和均不超過125。
那麼我們便可以做dp了。
如何設狀態呢?
我們接著發現第列行的數我們是不用管的
因為若列舉了前兩個數,第三個數自然也就出來了
所以我們設: f[
i,j,
k]為做
到第i行
,第一列
和為j,
第二列和
為k的合
法方案數
那麼 f[
i+1,
j+x,
k+y]
+=f[
i,j,
k]mo
d1017
(x+y
<=a[
i+1]
,j+x
<=c1
,k+y
<=c2
) 那麼答案是不是就是f[n,c1,c2]?
不!若是合法的c1,c2,c3,a那麼便可以這樣做
但是若不合法呢?即c1
+c2+
c3<>∑n
i=1a
[i]
就要特殊判斷了
const mo=100000000000000000;
var n,c1,c2,c3,i,j,k,l,r,e:longint;
a:array[1..200] of longint;
f:array[0..200,0..130,0..130] of int64;
begin
assign(input,'1.in');reset(input);
readln(n,c1,c2,c3);
for i:=1
to n do
begin
read(a[i]);e:=e+a[i];end;
if e<>c1+c2+c3 then
begin writeln(0);exit;end;
f[0,0,0]:=1;
for i:=0
to n-1
dofor j:=0
to c1 do
for k:=0
to c2 do
for l:=0
to a[i+1] do
for r:=0
to a[i+1] do
if l+r>a[i+1] then
break
else
if (j+l<=c1)and(k+r<=c2) then
begin
f[i+1,j+l,k+r]:=(f[i,j,k]+f[i+1,j+l,k+r])mod mo;
end;
writeln(f[n,c1,c2]);
close(input);close(output);
end.
CQOI2008 矩陣的個數
description 給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。input 第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。output 僅乙個數,滿足條件的矩陣...
CQOI2008 矩陣的個數
反正對今天是無言。給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。僅乙個數,滿足條件的矩陣個數模10 17的值。3 2 3...
nyoj 206 矩陣的個數
時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 在乙個3 2的矩形中,可以找到6個1 1的矩形,4個2 1的矩形3個1 2的矩形,2個2 2的矩形,2個3 1的矩形和1個3 2的矩形,總共18個矩形。給出a,b,計算可以從中找到多少個矩形。輸入本題有多組輸入資料 10000 ...