动态规划题,设 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;
}
继续加油。