FZU2126:消除类游戏(DP)

FZU2126:消除类游戏(DP)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Problem Description

S近期在玩一种游戏。

这样的游戏的规则是一个一个地往一个栈里放有颜色的球,当栈顶连续k个球颜色同样时。这k个球立马同一时候消失。

如今S已经往栈里放了n个球,他想知道再放m个球,然后使得栈里的球都被消去的放法有多少种。两种放法不同是指存在放的第i个球这两种放法放的球的颜色不同。因为方法数可能非常多,将答案mod 1000000007。

FZU2126:消除类游戏(DP) Input

输入包括多组数据。输入数据的第一行为四个整数n,m,h,k(0<=n,m,h<=1000,2<=k<=1000),表示已经放了n个球,有h种不同颜色的球,若栈顶出现连续k个球颜色同样则这k个球同一时候消失,问再放m个球。使得最后栈里的球都被消去的放法数。

第二行从左往右依次输入n个整数,范围为1到h,表示刚開始往栈里放的球的颜色,放入顺序与输入顺序同样,数据保证已经放入的n个球不会存在连续k个球颜色同样。答案对1000000007取余。

FZU2126:消除类游戏(DP) Output

输出一行一个整数M,表示对1000000007取余后的放法数。

FZU2126:消除类游戏(DP) Sample Input

3 6 3 3 1 2 20 6 2 3

FZU2126:消除类游戏(DP) Sample Output

98

dp[i][j]代表还须要放i个球,还有j个球须要消去的情况

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int mod = 1000000007;
int n,m,h,k;
int cur,pre,tot;
long long dp[1005][1005];
int main()
{
    int i,j;
    while(~scanf("%d%d%d%d",&n,&m,&h,&k))
    {
        memset(dp,0,sizeof(dp));
        pre = cur = tot = 0;
        for(i = 0; i<n; i++)
        {
            scanf("%d",&cur);
            if(cur != pre)//不等于前面,还须要k-1个球才干消去
                tot+=k-1;
            else//来一个相等的就减去1
                tot--;
            pre = cur;
        }
        dp[m][tot] = 1;//直接按如今所存在的数字消去的方法仅仅有一种
        for(i = m; i>0; i--)
        {
            for(j = i; j>=0; j--)
            {
                if(i-1>=j+k-1)//假设末尾放一个与栈末尾的求不同的球,那么对应的情况要多加k-1个球
                    dp[i-1][j+k-1] = (dp[i-1][j+k-1]+dp[i][j]*(j?(h-1):h))%mod;
                if(j-1<0)
                    break;
                dp[i-1][j-1] = (dp[i-1][j-1]+dp[i][j])%mod;//依据前面能够知道,我在末尾放一个与栈尾同样的球,那么我还须要放的个数必定是减去1的
            }
        }
        printf("%lld\n",dp[0][0]);
    }

    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117257.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Linux安装gcc的四种方法「建议收藏」

    Linux安装gcc的四种方法「建议收藏」相比于windows系统,Linux安装程序就比较复杂了,很多需要root用户才能安装。常见的有以下几种安装方法 源码安装 rpm包安装 yum安装(RedHat、CentOS) apt-get安装(debian,ubuntu) 源码安装以安装gcc为例,登陆https://gcc.gnu.org/,下载自己想要的版本的gcc安装包上传gcc-4.1.2.tar.gz到Linux服务器任意目录,解压解压目录执行shell命令./configurat.

  • H264编码流程_h265和h265+视频编码有什么差别

    H264编码流程_h265和h265+视频编码有什么差别H264编码流程手绘图:H264编码网上图:

    2022年10月23日
  • mvnw_进入pod命令

    mvnw_进入pod命令我们使用Maven时,基本上只会用到mvn这一个命令。mvnw是MavenWrapper的缩写。因为我们安装Maven时,默认情况下,系统所有项目都会使用全局安装的这个Maven版本。但是,对于某些项目来说,它可能必须使用某个特定的Maven版本,这个时候,就可以使用MavenWrapper,它可以负责给这个特定的项目安装指定版本的Maven,而其他项目不受影响。该工具可以在大型、多人协作的项目统一Maven的版本,避免因为不一致造成意想不到的bug简单地说,MavenWrapper就是给一个

    2022年10月23日
  • MySQL中MyISAM与InnoDB区别及选择

    MySQL中MyISAM与InnoDB区别及选择

    2021年10月30日
  • 0-1多重背包(单调队列+多重背包)[通俗易懂]

    0-1多重背包(单调队列+多重背包)[通俗易懂]原题链接有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V (0<N≤1000, 0<V≤20000),用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N≤1

  • 800个有趣句子帮你记忆7000个单词[通俗易懂]

    800个有趣句子帮你记忆7000个单词[通俗易懂]800个有趣句子帮你记忆7000个单词   1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。 2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号