原題:
http://172.16.0.132/junior/#contest/show/1394/2
題目描述:
小x開發(fā)了一個(gè)奇怪的游戲,這個(gè)游戲的是這樣的:一個(gè)長(zhǎng)方形,被分成 N 行 M 列的格子剧蹂,第 i 行第 j 列的格子記為 (i, j)侠鳄,就是說异剥,左上角的格子是 (1, 1)济竹,右下角的格子是 (N痕檬, M)。開始的時(shí)候送浊,小y在 (1梦谜, 1),他需要走到 (N, M)唁桩。每一步闭树,小y可以走到正右方或者正下方的一個(gè)格子。具體地說荒澡,如小y現(xiàn)在在 (x报辱, y),那么他可以走到 (x单山, y + 1) 或 (x + 1碍现, y)。當(dāng)然米奸,小y不能走出離開這個(gè)長(zhǎng)方形昼接。
每個(gè)格子有積分,用一個(gè) 1~10 的整數(shù)表示悴晰。經(jīng)過這個(gè)格子慢睡,就會(huì)獲取這個(gè)格子的積分(起點(diǎn)和終 點(diǎn)的積分也計(jì)算)。通過的方法是:到達(dá) (N铡溪, M) 的時(shí)候漂辐,積分恰好為 P 。
現(xiàn)在給出這個(gè)長(zhǎng)方形每個(gè)格子的積分棕硫,你需要幫助小y者吁,求出從起點(diǎn)走到終點(diǎn),積分為 P 的線路有多少條饲帅。
輸入:
第 1 行3 個(gè)整數(shù) N, M, P 复凳。
接下來 N 行,每行 M 個(gè)整數(shù) Aij 灶泵,表示格子 (i育八, j) 的積分。
輸出:
1 行1 個(gè)整數(shù)赦邻,表示積分為 P 線路的數(shù)量髓棋。
因?yàn)閿?shù)值太大,你只需要輸出結(jié)果除以 (10^9 + 7) 的 余數(shù)惶洲。
樣例輸入:
3 3 9
2 2 1
2 2 2
1 2 2
樣例輸出:
2
數(shù)據(jù)范圍限制:
對(duì)于 50% 的數(shù)據(jù):1 ≤ N按声, M ≤ 10。
對(duì)于 100% 的數(shù)據(jù):1 ≤ N恬吕, M ≤ 100签则,0 ≤ Aij ≤ 10。
分析:
設(shè)f[i,j,k]為在第i行铐料,第j列渐裂,積分為k的方案數(shù)豺旬,則f[1][1][a[1][1]]=1;
方程為:f[i,j,k]=(f[i-1,j,k-a[i,j]]+f[i,j-1,k-a[i,j]])%1e9+7;(注意特判!F饬埂W逶摹)
實(shí)現(xiàn):
#include<cstdio>
const int mod=1e9+7;
int n,m,p,i,j,k,a[101][101],f[101][101][2001];
int main()
{
freopen("count.in","r",stdin);freopen("count.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) scanf("%d",&a[i][j]);
f[1][1][a[1][1]]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=1;k<=p;k++)
{
if(i-1>0)
if(j-1>0) f[i][j][k]=(f[i-1][j][k-a[i][j]]+f[i][j-1][k-a[i][j]])%mod;
else f[i][j][k]=f[i-1][j][k-a[i][j]]%mod;
else
if(j-1>0) f[i][j][k]=f[i][j-1][k-a[i][j]]%mod;
}
printf("%d",f[n][m][p]%mod);
}