【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。

解法二、三均为递推,二者大同小异。时间关系以后补上~

posted @ 2016-11-02 00:12  嘒彼小星  阅读(250)  评论(0编辑  收藏  举报