zoukankan      html  css  js  c++  java
  • CODEVS——T 2618 核电站问题

    http://codevs.cn/problem/2618/

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。

    任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数。

    输入描述 Input Description

    输入文件只一行,两个正整数N,M( 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)

    f[n][i]表示这n个坑,有i个连续放着物品。

    明显地存在  f[n][0]=Σf[i][0],  f[n][i]=f[n-1][i-1]。

     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 
    10 #define LL long long
    11 int n,m;
    12 LL sum[55][9],ans;
    13 
    14 LL DFS(int now,int cnt)
    15 {
    16     if(now<cnt) return 0;
    17     if(sum[now][cnt]) return sum[now][cnt];
    18     if(!cnt)
    19       for(int i=0; i<m; ++i)
    20          sum[now][cnt]+=DFS(now-1,i);
    21     else sum[now][cnt]=DFS(now-1,cnt-1);
    22     return sum[now][cnt];
    23 }
    24 
    25 int AC()
    26 {
    27     read(n),read(m);
    28     sum[0][0]=sum[1][0]=1;
    29     for(int i=0; i<m; ++i)
    30         ans+=DFS(n,i);
    31     printf("%lld
    ",ans);
    32     return 0;
    33 }
    34 
    35 int Aptal=AC();
    36 int main(){;}
    记忆化搜索
     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 
    10 #define LL long long
    11 int n,m;
    12 LL f[55][9],ans;
    13 
    14 int AC()
    15 {
    16     read(n),read(m);
    17     f[0][0]=f[1][0]=f[1][1]=1;
    18     for(int i=2; i<=n; ++i)
    19     {
    20         for(int j=0; j<=i&&j<m; ++j)
    21         if(!j) f[i][j]+=f[i-1][j];
    22         else
    23         {
    24             f[i][0]+=f[i-1][j];
    25             f[i][j]=f[i-1][j-1];
    26         }
    27     }
    28     for(int i=0; i<m; ++i) ans+=f[n][i];
    29     printf("%lld
    ",ans);
    30     return 0;
    31 }
    32 
    33 int Aptal=AC();
    34 int main(){;}
    DP
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    谈谈关于MVP模式中V-P交互问题
    Delphi MVC模 2
    Delphi MVC模式 1
    Java长整除问题
    Java中Scanner类的简单用法
    Java中throw和throws的区别
    Java必须掌握的运算符
    Java编程多重循环
    Java实现三种简单的排序
    使用Java向properties存数据
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7512554.html
Copyright © 2011-2022 走看看