HDU 1545(01-K Code)

動態規劃題,設 dp[i][j][k] 表示長爲 i 的子序列中,0 比 1 最多多 j 個,1 比 0 最多多 k 個。

如果第 i+1 位填0,則 dp[i + 1][j + 1][max(k - 1, 0)] += dp[i][j][k];

如果第 i+1 位填1,則 dp[i + 1][max(j - 1, 0)][k + 1] += dp[i][j][k]。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

__int64 dp[65][10][10];

int main()
{
    int N, M;
    while (cin >> N >> M)
    {
        memset(dp, 0, sizeof(dp));

        dp[0][0][0] = 1;
        for (int i = 0; i <= N; i++)
        {
            for (int j = 0; j <= M; j++)
            {
                for (int k = 0; k <= M; k++)
                {
                    dp[i + 1][j + 1][max(k - 1, 0)] += dp[i][j][k]; //第i+1位填0
                    dp[i + 1][max(j - 1, 0)][k + 1] += dp[i][j][k]; //第i+1位填1
                }
            }
        }

        __int64 ans = 0;
        for (int i = 0; i <= M; i++)
        {
            for (int j = 0; j <= M; j++)
                ans += dp[N][i][j];
        }
        cout << ans << endl;
    }
    return 0;
}

繼續加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章