hdu 1978 How many ways
状态转移方程:dp[i+k][j+l] = (dp[i+k][j+l] + dp[i][j]) % 10000;
dp[i][j]表示到达点(i,j)的途径数, 其中k,l为处在点(i,j)时,能够到达点(i+k,j+l)。
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <vector> #include <set> #include <queue> #include <stack> #include <climits>//形如INT_MAX一类的 #define MAX 105 #define INF 0x7FFFFFFF # define eps 1e-5 using namespace std; int dp[MAX][MAX],map[MAX][MAX]; int n,m; void solve() { dp[0][0] = 1; int i,j,k,l; for(i=0; i<n; i++) for(j=0; j<m; j++) { int t = map[i][j]; for(k=0; k<=t; k++) { if(i+k >= n) break; for(l=0; l+k<=t; l++) { if(l+j >= m) break; if(k == 0 && l == 0) continue; dp[i+k][j+l] = (dp[i+k][j+l] + dp[i][j]) % 10000; } } } } int main() { int t,i,j; cin >> t; while(t--) { memset(dp,0,sizeof(dp)); cin >> n >> m; for(i=0; i<n; i++) { for(j=0; j<m; j++) { scanf("%d",&map[i][j]); } } solve(); printf("%d\n",dp[n-1][m-1]); } return 0; }