分析: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