hdu 1978単純dp


実は現在の点を列挙して、それから打つことができる点を列挙して、初期の点を最初に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] ); } }