1. 程式人生 > >NOIP 2008 普及組 複賽 ball 傳球遊戲

NOIP 2008 普及組 複賽 ball 傳球遊戲

//p1057 傳球遊戲
//該題與 P1164 小A點菜 有點 象
//模擬樣例,一直覺得挺奇怪的,應該有很多種啊,一模擬,發現1->2->1是不行的。
//樣例弄懂的,很多時候弄懂樣例,紙筆比在腦子裡憑空想想,更有效。
//沒感覺,翻看https://wenku.baidu.com/view/5b9dfd5abe23482fb4da4c40.html
//直接dp,似乎說遞推更確切點。
//f(i,k)表示經過k次傳到編號為i的人手中的方案數。那麼可以推出下面的方程:
//f(i,k)=f(i-1,k-1)+f(i+1,k-1)(i=1或n時,需單獨處理)
//邊界條件:f(1,0)=1;結果在f(1,m)中
//大致有些感覺,兩個量,一是i人,二是k次
//編的過程中,發現下手有些困難,但之前有動態規劃的經驗,還是硬寫下來,但樣例沒法通過
//手動模擬一編,發現問題,馬上修改,樣例通過,提交RE,翻看他人程式碼,才發現
//a=i-1;//1此處漏
//b=i+1;//1此處漏
//很小的兩處問題。   
#include <stdio.h>
#include <string.h>
int f[30+10][30+10];
int main(){
    int n,m,i,j,a,b;
    scanf("%d%d",&n,&m);
    memset(f,0,sizeof(f));
    f[1][0]=1;
    for(j=1;j<=m;j++)
        for(i=1;i<=n;i++){
            a=i-1;//1此處漏
            b=i+1;//1此處漏
            if(i-1==0){
                a=n;
            }
            else if(i+1>n)
                b=1;
            f[i][j]=f[a][j-1]+f[b][j-1];
        }
    printf("%d\n",f[1][m]);
    return 0;
}