洛谷 P1057 [NOIP2008 普及组] 传球游戏

题目链接

这是一道dp题。

传到一个人手上的情况数等于上一轮传到左边的人的情况数加上传到右边的人的情况数。

即f【i】【j】=f【i-1】【j-1】+f【i+1】【j+1】.

注意一下环的边界。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m,dp[35][35]; 
int main(){
    scanf("%d%d",&n,&m);
    dp[0][1]=1;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            if(j==1)
                dp[i][j]=dp[i-1][n]+dp[i-1][2];
            else if(j==n)
                dp[i][j]=dp[i-1][1]+dp[i-1][n-1];
            else
                dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
    printf("%d",dp[m][1]);
    
}

看了下洛谷的题解(果然会有奇奇怪怪的东西。。。)

排序不等式是长知识了。逆序和<=乱序和<=顺序和。(当且仅a全部相同,b全部相同时等号成立)

(不过薛山定理到底是什么玩意啊)

 

posted @ 2021-02-19 19:46  mikku  阅读(167)  评论(0)    收藏  举报