標籤:style blog color os io for div amp
hdu 1267 下沙的沙子有幾粒?(二維遞推題)
題意:就是給你m個H和n個D,然後從左開始數H的累積個數總是不比D的累計數少的排列有多少種舉一個測試案例吧:3個H和1個D總共有3種排列,依次是:H D H H,H H D H,H H H D三種排列,親~意思應該懂了吧?!呵呵。。。
思路:遞推公式為:a[m][n]=a[m-1][n]+a[m][n-1];然後當n=0的時候無論m取何值都是1,遞推公式怎麼推來的呢?我現在說下我的思路吧!假設3個H和2個D是由2個H和2個D還有3個H一個D推來的,2個H和2個D總共有H D H D,H H D D兩種排列,3個H和一個D總共有H D H H,H H D H,H H H D三種排列,然後在H D H D,H H D D的後面添加一個H就是2中排列,在H D H H,H H D H,H H H D的後面添加一個D就有3種方案,所以總共就是5種方案(其它的添加方法都是重複的,不信的話自己可以試一下)
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int n,m; 7 __int64 a[25][25]; //注意這種用法,雖然說相當於longlong,但換成longlong後就會WA...囧(前面有兩條虛線) 8 int i,j; 9 memset(a,0,sizeof(a));10 for(i = 0; i<=20; i++)11 {12 a[i][0] = 1;13 }14 for(i = 1; i<=20; i++)15 {16 for(j = 1; j<=20; j++)17 {18 if(i<j)19 break;20 a[i][j] = a[i-1][j] + a[i][j-1];21 }22 }23 while(~scanf("%d%d",&n,&m))24 {25 printf("%I64d\n",a[n][m]); //這種輸出方式....26 }27 28 return 0;29 }
這種題現在的我還hold不住,遞推公式給不出來就不會寫.....T_T