zoj 2745 dp
dp,以后想清楚了再打代码,疼了很久 ( 注意题目中的这句话 “ In any consecutive substring of S”)
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> using namespace std; #define LL long long const int mid=1; const LL N=100; const LL M=10+mid; LL dp[N][M][M][M]; LL sum[N][M]; int main(){ dp[1][1][1][0]=1; dp[1][1][0][1]=1; for(int i=1;i<=62;i++){ for(int j=1;j<=5;j++){ for(int k=0;k<=j;k++){ for(int l=0;l<=j;l++){ if(k&&l){ if(k+1<=j) dp[i+1][j][k+1][l-1]+=dp[i][j][k][l]; else dp[i+1][k+1][k+1][l-1]+=dp[i][j][k][l]; if(l+1<=j) dp[i+1][j][k-1][l+1]+=dp[i][j][k][l]; else dp[i+1][l+1][k-1][l+1]+=dp[i][j][k][l]; }else { if(!k&&l){ if(l+1<=j) dp[i+1][j][k][l+1]+=dp[i][j][k][l]; else dp[i+1][l+1][k][l+1]+=dp[i][j][k][l]; dp[i+1][j][k+1][l-1]+=dp[i][j][k][l]; }else if(k&&!l){ if(k+1<=j) dp[i+1][j][k+1][l]+=dp[i][j][k][l]; else dp[i+1][k+1][k+1][l]+=dp[i][j][k][l]; dp[i+1][j][k-1][l+1]+=dp[i][j][k][l]; } } } } } } for(int i=1;i<=62;i++){ //cout<<i<<": "; for(int j=0;j<=5;j++){ for(int k=0;k<=j;k++){ for(int l=0;l<=j;l++){ sum[i][j]+= dp[i][j][k][l]; } } /* cout<<sum[i][j]<<" ";*/ } //cout<<endl; } int n,m; while(cin>>n>>m){ LL ans=0; for(int i=0;i<=m;i++){ ans+=sum[n][i]; } cout<<ans<<endl; } }