反正對今天是無言。。。
給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10^17的值。
第一行包含四個正整數n,c1, c2, c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。
僅乙個數,滿足條件的矩陣個數模10^17的值。
3 2 3 41 2 6
171<=n<=200
其實這道題就是dp,如果用暴搜,必爆。。。
它的思路是這樣滴
我們可以發現,只要決定了第一列和第二列的數,第三列的數就已經是確定了
那麼我們就只需要考慮第一二列的數就行
那麼我們需要五層迴圈:1.i【1~n】,用來表示的是到第幾行
2.j【0~c1】,用來表示第一列的總和
3.k【0~c2】,用來表示第二列的總和
4.x【0~min(j,a[i])】,用來表示第一列的取值,但是取值不能超過它的限制條件
5.y【0~min(k,a[i]-x)],用來表示第二列的取值,但是取值不能超過它的限制條件
在mlg大佬的幫助下,我成功地意識到滾動的重要性,主要是空間只給了60mb左右,易燃易**?
其實我們可以發現,我們每一層的狀態都是一層層推下來,那麼的話,我們就可以發現,我們到達的這一層的狀態只與上一層狀態有關
所以一波滾動走起
對了忘記說動態方程了,其實到這裡很明顯,就是:
f[i&1][j][k]+=f[(i&1)^1][j-x][k-y],f[i&1][j][k]%=mod
**獻上:
#include#include#include
#include
using
namespace
std;
typedef
long
long
ll; ll n,c1,c2,c3;
ll a[
300];
ll f[
2][150][150
];int
main()
if(sum!=c1+c2+c3)
//特判一下,看看所給資料是否滿足條件
f[0][0][0]=1; //
初始化,注意
for(ll i=1;i<=n;i++)
for(ll j=0;j<=c1;j++)
for(ll k=0;k<=c2;k++)
printf(
"%lld
",f[n&1
][c1][c2]);
}
CQOI2008矩陣的個數
給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。1 n 200 抓住題目的資料範圍n 200,每行每列之和均不超過125。...
CQOI2008 矩陣的個數
description 給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。input 第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。output 僅乙個數,滿足條件的矩陣...
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 ...