在每一个格子里都有一个能量值,游戏规则是每一步都要消耗一点能量值,只能向下或者向右走,因此对于你所处的每一个格子,对于从这个格子出发可以到达的所有格子都要累加:到达第(i, j)个格子的方法数是dp[i][j], 对于从(i, j)格子可以到达的格子(i+k, j+t), dp[i+k][j+t] += dp[i][j]; 记住取模,此处没有取模。水题~贴代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int Map[200][200], dp[200][200];
int main()
{
int n, m, T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
{
scanf("%d", &Map[i][j]);
}
}
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
{
int x = Map[i][j];
for(int k=0; k<=x; ++k)
{
for(int t=0; t<=x; ++t)
{
if(k+t <= x && (k+t)!=0)
dp[i+k][j+t] = (dp[i+k][j+t] + dp[i][j]) % 10000;
}
}
}
}
cout << dp[n-1][m-1] << endl;
}
return 0;
}
效率挺低的,求大神告知高效代码!