uva 1638(dp)

从大到小放,最后放最小的,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,怎么办啊

posted on 2018-02-04 17:30  发牌员  阅读(104)  评论(0)    收藏  举报

导航