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

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

  • 相关阅读:
    jQuery 入门 -- 事件 事件绑定与事件委托
    原生js实现视差风格音乐播放器
    jQuery 入门
    一些开放的免费接口【已失效】
    php mysqli操作数据库
    DOM 相关
    面向对象
    对象
    博客园添加鼠标点击特效
    正则表达式
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6537768.html
Copyright © 2020-2023  润新知