标签:
名曰递推实际上是一类DP计数问题。
UVa 10081 - Tight Words
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <cmath> #define mod 10000 using namespace std; double dp[105][12]; int main() { int k,n; while(scanf("%d%d",&k,&n)!=EOF) { double m=pow((k+1)*1.0,n); memset(dp,0,sizeof(dp)); for(int i=0; i<=k; ++i) dp[1][i]=1; for(int i=2; i<=n; ++i) for(int j=0; j<=k; ++j) if(!j) dp[i][j]=dp[i-1][j]+dp[i-1][j+1]; else dp[i][j]=dp[i-1][j-1]+dp[i-1][j]+dp[i-1][j+1]; double s=0; for(int i=0; i<=k; ++i) s+=dp[n][i]; printf("%.5lf\n",100*s/m); } return 0; }
UVa 10128 - Queue
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <cmath> #define mod 10000 using namespace std; int dp[20][20][20]; void init() { dp[1][1][1]=1; dp[2][1][2]=dp[2][2][1]=1; for(int i=3; i<=13; ++i) for(int j=1; j<=i; ++j) for(int k=1; k<=i; ++k) dp[i][j][k]=(i-2)*dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]; } int main() { int T; scanf("%d",&T); init(); while(T--) { int n,l,r; scanf("%d%d%d",&n,&l,&r); if(l<=n&&r<=n) printf("%d\n",dp[n][l][r]); else printf("0\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/kkkwjx/p/3731883.html