The King’s Ups and Downs(HDU 4489,動態規劃遞推,組合數,國王的遊戲)
阿新 • • 發佈:2018-11-10
題意:
給一個數字n,讓1到n的所有數都以波浪形排序,即任意兩個相鄰的數都是一高一低或者一低一高
比如:1324 4231,再比如4213就是錯的,因為4高,2低,接下來1就應該比2高,但是它沒有
接下來思路用筆記截圖形式表示
#include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn=25; ll dp[maxn][2]; ll c[maxn][maxn]; int main() { ll n; cin>>n; if(n==1) { cout<<1<<endl; return 0; } c[1][1]=1; for(ll i=1;i<=n;i++) c[i][0]=1; for(ll i=2;i<=n;i++) for(ll j=1;j<=i;j++) { c[i][j]=c[i-1][j]+c[i-1][j-1]; } dp[1][0]=1;dp[1][1]=1; dp[0][0]=1;dp[0][1]=1; for(ll i=2;i<=n;i++) { for(ll j=0;j<=i-1;j++) { dp[i][0]+=c[i-1][j]*dp[j][0]*dp[i-1-j][1]; } dp[i][0]/=2; dp[i][1]=dp[i][0]; } cout<<dp[n][0]+dp[n][1]<<endl; for(ll i=1;i<=n;i++) { printf("\ni=%lld:%lld,%lld\n",i,dp[i][0],dp[i][1]); } }