The King’s Ups and Downs(HDU 4489,动态规划递推,组合数,国王的游戏)
题意:
给一个数字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]); } }