HDU1978_DP

在每一個格子裏都有一個能量值,遊戲規則是每一步都要消耗一點能量值,只能向下或者向右走,因此對於你所處的每一個格子,對於從這個格子出發可以到達的所有格子都要累加:到達第(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;
}

效率挺低的,求大神告知高效代碼!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章