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。
解法二、三均爲遞推,二者大同小異。時間關係以後補上~