zoukankan      html  css  js  c++  java
  • 【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。

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

  • 相关阅读:
    48. Rotate Image
    83. Remove Duplicates from Sorted List
    46. Permutations
    HTML5笔记
    18. 4Sum
    24. Swap Nodes in Pairs
    42. Trapping Rain Water
    Python modf() 函数
    Python min() 函数
    Python max() 函数
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6537768.html
Copyright © 2011-2022 走看看