動態規劃題,設 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;
}
繼續加油。