从大到小放,最后放最小的,dp[i-1][l-1][r]放最左边,dp[i-1][l][r-1]放最右边,dp[i-1][l][r]*(ll)(i-2)放在i-1块之间。。。。。。。肯定不是我想出来的啊!看的紫书上的思路,
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int maxn=30; typedef long long ll; ll dp[maxn][maxn][maxn]; void init() { memset(dp,0,sizeof(dp)); dp[1][1][1]=1; for(int i=2; i<=20; i++) for(int l=1; l<=i; l++) for(int r=1; r<=i-l+1; r++) { dp[i][l][r]=dp[i-1][l-1][r]+dp[i-1][l][r-1]+dp[i-1][l][r]*(ll)(i-2); } } int n,t,l,r; int main() { init(); scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&l,&r); printf("%lld\n",dp[n][l][r]); } return 0; }
递推太tm难了,我推了3个题,连样例都过不了。。。。。。。。。QAQ,怎么办啊
转载于:https://www.cnblogs.com/Wangwanxiang/p/8413691.html