【OpenJudge9267】 核電站 動態規劃

9267:核電站

總時間限制: 5000ms 單個測試點時間限制: 1000ms 內存限制: 131072kB
描述
一個核電站有N個放核物質的坑,坑排列在一條直線上。如果連續M個坑中放入核物質,則會發生爆炸,於是,在某些坑中可能不放核物質。

任務:對於給定的N和M,求不發生爆炸的放置核物質的方案總數

輸入
只一行,兩個正整數N,M( 1 < N < 50,2 ≤ M ≤ 5 )

輸出
一個正整數S,表示方案總數。

樣例輸入
4 3
樣例輸出
13

題解:維護一個二維數組f,f[i][1] 表示前i個坑,第i個坑放的方案數,f[i][0] 表示前i個坑,第i個坑不放的方案數。

首先,f[i][0]=f[i1][0]+f[i1][1]1in 因爲若第i個不放那麼隨便放,沒有任何限制。
若第i個坑放,那麼有三種情況:

f[i][1]=f[i1][1]+f[i1][0](i<m)f[i1][1]+f[i1][1]1(i==m)f[i1][1]+f[i1][0]f[im][0](i>m)

1.若i<m 那麼無論放不放都不會爆炸
2.若i==m 那麼該坑放的話前面肯定有不能放的坑,所以少了一種全部都放的情況,所以1
3.若i>m 那麼該點放的話,第im 的坑之間必須有不放的坑,那麼前去f[im][0] 的方案數。

代碼:

#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,f[55][2];
int main()
{
    int i,j;
    scanf("%lld%lld",&n,&m);
    f[1][0]=1;
    f[1][1]=1;
    for (i=2;i<=m-1;i++)
    {
        f[i][1]=f[i-1][1]+f[i-1][0];
        f[i][0]=f[i-1][0]+f[i-1][1];
    }
    f[m][0]=f[m-1][0]+f[m-1][1];
    f[m][1]=f[m-1][0]+f[m-1][1]-1;
    for (i=m+1;i<=n;i++)
    {
        f[i][0]=f[i-1][0]+f[i-1][1];
        f[i][1]=f[i-1][1]+f[i-1][0]-f[i-m][0];
    }
    printf("%lld",f[n][1]+f[n][0]);
}
發佈了79 篇原創文章 · 獲贊 32 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章