hdu 1978単純dp
1195 ワード
実は現在の点を列挙して、それから打つことができる点を列挙して、初期の点を最初に1にして、それから各到達可能な点に現在の点の到達可能な数を加えます
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[107][107];
int a[107][107];
int main ( )
{
int t,n,m;
scanf ( "%d" , &t );
while ( t-- )
{
scanf ( "%d%d" , &n , &m );
for ( int i = 1 ; i <= n ; i++ )
for ( int j = 1 ; j <= m ; j++ ) scanf ( "%d" , &a[i][j] );
memset ( dp , 0 , sizeof ( dp ) );
dp[1][1] = 1;
for ( int i = 1 ; i <= n ; i++ )
for ( int j = 1 ; j <= m ; j++ )
for ( int k = 0 ; k <= a[i][j] ; k++ )
for ( int t = 0 ; t <= a[i][j] - k ; t++ )
{
if ( k == t && k == 0 ) continue;
if ( i + k > n ) continue;
if ( j + t > m ) continue;
dp[i+k][j+t] += dp[i][j];
dp[i+k][j+t] %= 10000;
}
printf ( "%d
" , dp[n][m] );
}
}