(File IO): input:count.in output:count.out
时间限制: 1000 ms 空间限制: 256000 KB 具体限制
Goto ProblemSet
题目描述
小
x
x
x开发了一个奇怪的游戏,这个游戏的是这样的:一个长方形,被分成
N
N
N 行
M
M
M 列的格子,第
i
i
i 行第
j
j
j 列的格子记为
(
i
,
j
)
(i, j)
(i,j),就是说,左上角的格子是
(
1
,
1
)
(1, 1)
(1,1),右下角的格子是
(
N
,
M
)
(N, M)
(N,M)。开始的时候,小y在
(
1
,
1
)
(1, 1)
(1,1),他需要走到
(
N
,
M
)
(N, M)
(N,M)。每一步,小
y
y
y可以走到正右方或者正下方的一个格子。具体地说,如小
y
y
y现在在
(
x
,
y
)
(x, y)
(x,y),那么他可以走到
(
x
,
y
+
1
)
(x, y + 1)
(x,y+1) 或
(
x
+
1
,
y
)
(x + 1, y)
(x+1,y)。当然,小
y
y
y不能走出离开这个长方形。
每个格子有积分,用一个
1
10
1~10
1 10 的整数表示。经过这个格子,就会获取这个格子的积分(起点和终 点的积分也计算)。通过的方法是:到达
(
N
,
M
)
(N, M)
(N,M) 的时候,积分恰好为
P
P
P 。
现在给出这个长方形每个格子的积分,你需要帮助小
y
y
y,求出从起点走到终点,积分为
P
P
P 的线路有多少条。
输入
第
1
1
1 行
3
3
3 个整数
N
,
M
,
P
N, M, P
N,M,P 。
接下来
N
N
N 行,每行
M
M
M 个整数
A
i
j
Aij
Aij ,表示格子
(
i
,
j
)
(i, j)
(i,j) 的积分。
输出
1
1
1 行
1
1
1 个整数,表示积分为
P
P
P 线路的数量。
因为数值太大,你只需要输出结果除以
(
1
0
9
+
7
)
(10^9 + 7)
(109+7) 的 余数。
样例输入
3 3 9
2 2 1
2 2 2
1 2 2
样例输出
2
数据范围限制
对于
50
50%
50 的数据:
1
≤
N
,
M
≤
10
1 ≤ N, M ≤ 10
1≤N,M≤10。
对于
100
100%
100 的数据:
1
≤
N
,
M
≤
100
,
0
≤
A
i
j
≤
10
1 ≤ N, M ≤ 100,0 ≤ Aij ≤ 10
1≤N,M≤100,0≤Aij≤10。
解题思路
思路:递推
设
f
[
i
,
j
,
k
]
f[i,j,k]
f[i,j,k]为走到
(
i
,
j
)
(i,j)
(i,j),积分为k的路线有多少条
递推式为
f
[
i
,
j
,
k
]
=
f
[
i
,
j
,
k
]
+
f
[
i
−
1
,
j
,
k
−
a
[
i
,
j
]
]
+
f
[
i
,
j
−
1
,
k
−
a
[
i
,
j
]
]
f[i,j,k]=f[i,j,k]+f[i-1,j,k-a[i,j]]+f[i,j-1,k-a[i,j]]
f[i,j,k]=f[i,j,k]+f[i−1,j,k−a[i,j]]+f[i,j−1,k−a[i,j]]
他的上面的方案数+他右面的方案数.
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=1000000007;
int n,m,t;
int a[101][101],f[101][101][2000];
int main()
{
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
f[1][1][a[1][1]]=1;
for(int i=1;i<=n;i++)//枚举行
for(int j=1;j<=m;j++)//枚举列
for(int k=1;k<=t;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]])%INF;
else
f[i][j][k]=f[i-1][j][k-a[i][j]]%INF;
}
else
if(j-1>0)
f[i][j][k]=f[i][j-1][k-a[i][j]]%INF;
}
printf("%d",f[n][m][t]%INF);
}