zoukankan      html  css  js  c++  java
  • 1173

    题目大意:n个不同身高的队员和教练的按照身高排成波浪形……
    每个人按照身高由低到高编号,
    其中第m个是教练,他必须在第一个,
    如果条件允许,排第二的要比m低,
    如果条件不允许,即其余人都比教练高,则要让差距尽可能小,求排队方案数。

    题目思路:

    dp_up[i][j],代表i个人排队,第j个人排在队首,且第二个人小于第一个人的方案数

    dp-down[i][j],代表i个人排队,第j个人排在队首,且第二个人大于第一个人的方案数

    那么dp_up[i][j] = Sum(dp_down[i-1][j]),因为要求第二个人高于第一个人,所以i<j<=n

    那么dp_down[i][j] = Sum(dp_up[i-1][j]),1<=j<j。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #define MAXSIZE 505
    #define LL unsigned long long
    
    using namespace std;
    
    LL dp_up[MAXSIZE][MAXSIZE],dp_down[MAXSIZE][MAXSIZE];
    
    LL Solve(int n,int k)
    {
        if(k==1)
        {
            if(n <= 2)
                return 1;
            else
                return dp_down[n-1][2];
        }
    
        LL ans = 0;
        for(int i=1;i<k;i++)
            ans += dp_up[n-1][i];
        return ans;
    }
    
    int main()
    {
        memset(dp_up,0,sizeof(dp_up));
        memset(dp_down,0,sizeof(dp_down));
        //for(int i=1;i<=50;i++)
            dp_up[1][1] = dp_down[1][1] = 1;
        for(int i=2;i<=50;i++)
        {
            for(int j=1;j<=i;j++)
            {
                for(int q=1;q<j;q++)
                {
                    dp_down[i][j] += dp_up[i-1][q];
                }
    
                for(int q=j;q<=i;q++)
                {
                    dp_up[i][j] += dp_down[i-1][q];
                }
            }
        }
        int T,n,k,cns=1;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&k);
            LL ans = Solve(n,k);
            printf("Case %d: %llu
    ",cns++,ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    js笔记4
    js笔记3
    js笔记2
    js笔记1
    前端笔记13
    (7)第3章的开始
    (6)第2章的尾巴~
    (5)自定义数据结构再探
    我的学习方法(6)
    (4)自定义数据结构初探
  • 原文地址:https://www.cnblogs.com/alan-W/p/7698179.html
Copyright © 2011-2022 走看看