(File IO): input:count.in output:count.out
时间限制: 1000 ms 空间限制: 256000 KB 具体限制
Goto ProblemSet
题目描述
小
开发了一个奇怪的游戏,这个游戏的是这样的:一个长方形,被分成
行
列的格子,第
行第
列的格子记为
,就是说,左上角的格子是
,右下角的格子是
。开始的时候,小y在
,他需要走到
。每一步,小
可以走到正右方或者正下方的一个格子。具体地说,如小
现在在
,那么他可以走到
或
。当然,小
不能走出离开这个长方形。
每个格子有积分,用一个
的整数表示。经过这个格子,就会获取这个格子的积分(起点和终 点的积分也计算)。通过的方法是:到达
的时候,积分恰好为
。
现在给出这个长方形每个格子的积分,你需要帮助小
,求出从起点走到终点,积分为
的线路有多少条。
输入
第
行
个整数
。
接下来
行,每行
个整数
,表示格子
的积分。
输出
行
个整数,表示积分为
线路的数量。
因为数值太大,你只需要输出结果除以
的 余数。
样例输入
3 3 9
2 2 1
2 2 2
1 2 2
样例输出
2
数据范围限制
对于
的数据:
。
对于
的数据:
。
解题思路
思路:递推
设
为走到
,积分为k的路线有多少条
递推式为
他的上面的方案数+他右面的方案数.
代码
#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);
}