分析:dp[i][j][k]表示长度为i的串含j个相邻的1并且以k为结尾的种数。状态转移方程:dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1];边界dp[1][0][0]=dp[1][0][1]=1;。
#include<iostream>
using namespace std;
int dp[105][105][2];
void init()
{
int i,j;
dp[1][0][0]=dp[1][0][1]=1;
for(i=2;i<=100;i++)
{
dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
dp[i][0][1]=dp[i-1][0][0];
for(j=1;j<i;j++)
{
dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1];
}
}
}
int main()
{
int P,n,k,t;
ios::sync_with_stdio(false);
cin>>P;
init();
while(P--)
{
cin>>t>>n>>k;
cout<<t<<" "<<dp[n][k][0]+dp[n][k][1]<<endl;
}
return 0;
}
HDU ACM 3284 Adjacent Bit Counts
原文地址:http://blog.csdn.net/a809146548/article/details/45823709