【CODEVS】2618 核電站問題

2618 核電站問題
時間限制: 1 s
空間限制: 32000 KB
題目等級 : 黃金 Gold
題解
查看運行結果
題目描述 Description
一個核電站有N個放核物質的坑,坑排列在一條直線上。如果連續M個坑中放入核物質,則會發生爆炸,於是,在某些坑中可能不放核物質。

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

輸入描述 Input Description
輸入文件只有一行,兩個正整數M,N(1 < N<50,2≤M≤5)

輸出描述 Output Description
輸出文件只有一個正整數S,表示方案總數。

樣例輸入 Sample Input
4 3

樣例輸出 Sample Output
13

數據範圍及提示 Data Size & Hint
( 1< N<50,2≤M≤5)

本題網絡上流行四種解法。其中一種三維dp有些囉嗦就不在此贅述。
首先強調:
1、使用long long
2、連續M個核燃料爆炸,所以合法的連續數至多爲M-1
約定:0.M表示從0到M-1,0..M表示從0到M(學過Ruby等語言的童鞋應該知道)

解法一:dp
設f[i][j]表示第i個坑連續放了j個(i>=j),則f[i][0.M]的累加和即爲第i個坑放放(m-1)個核燃料的方案總數。
可得狀態轉移方程:
f[i][0]=f[i-1]0.M
f[i][j]=f[i-1][j-1](第i個坑連續放了j個,相當於第i-1個坑連續放了j-1個的方案數,因爲第i個坑連續放了j個相當於第i-1個坑連續放了j-1個的每個方案,在第i個坑又放了一個)

程序如下:

#include<cstdio>
using namespace std;
long long f[60][10],ans;
int N,M;
int main()
{
    scanf("%ld%ld",&N,&M);
    //初始化
    f[1][0]=1;
    f[1][1]=1;
    for(int i=2;i<=N;i++)
    {
        for(int j=0;j<M;j++)
        {
            f[i][0]+=f[i-1][j];
        }
        for(int j=1;j<M;j++)
        {
            f[i][j]=f[i-1][j-1];
        }
    }
    //累加和
    for(int i=0;i<M;i++)
    {
        ans+=f[N][i];
    }
    printf("%ld",ans);
    return 0;
}

每個大括號都儘量寫上,以後改代碼很好改——取經自BKdalao。

解法二、三均爲遞推,二者大同小異。時間關係以後補上~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章