【牛客 - 369A】小D的剧场(线性dp)

题干:

链接:https://ac.nowcoder.com/acm/contest/369/A
来源:牛客网
 

题目描述

"我明白。"

作为这命运剧场永远的观众,小D一直注视着这片星光璀璨的舞台,舞台上,少女们的身姿演绎出了一幕幕动人的场景,令人回味无穷。

有的时候,小D也会自己写一些歌曲,来加入Starlight的剧本,使得剧本充满了新的生命力。

现在小D又要准备写乐谱了,小D写谱的方式比较独特。他会先写出一个按照音符出现顺序排成的序列,再进一步整合,每次整合会选取相邻的三个作为三和弦。整合次数无限。

小D选取的音符形如D5 F6这种形式,例如D5表示D大调sol(这里不考虑升降音)为了方便生成乐谱,他将这些音符进一步转化了,小D给C D E F G A B重新编号成了1 2 3 4 5 6 7,之后新的音符编号生成方式应为(字母对应的标号-1)*7+数字,例如C7=(1−1)×7+7=7C7=(1−1)×7+7=7

但小D讨厌一些他所认为的不优美的和弦,因此他并不希望自己的谱子里面有可能出现这样的三和弦,也就说音符组成的序列里不应该存在他所讨厌的子段,假如C5 F1 A2这三个音符凑成的和弦小D不喜欢,那么序列里面就不能出现C5 F1 A2,C5 A2 F1,A2 C5 F1,A2 F1 C5,F1 A2 C5,F1 C5 A2这六种子段。

现在小D正在推算有多少合法的序列,答案对 109+7109+7 取模。

星屑飘洒的舞台上,可人绽放的爱之花,请努力让大家星光闪耀吧!

输入描述:

第一行为两个整数 n, q ,表示序列的长度和有多少和弦小D不喜欢.
接下来 q 行,每行三个整数 a, b, c ,表示小D不想出现的和弦

输出描述:

一行一个整数,表示答案

示例1

输入

复制

10 10
18 3 3
43 28 22
42 28 3
48 48 4
29 9 31
47 9 22
1 22 49
15 48 29
2 8 27
4 24 34

输出

复制

382785822

示例2

输入

复制

3 1
1 2 3

输出

复制

117643

说明

 

一共有6种不合法的序列:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

答案为493−6=117643493−6=117643

备注:

3≤n≤500,0≤q≤117649,1≤a,b,c≤49

解题报告:

    眼残党表示刚开始没有读题、、认为q<=117649 ,正好是49^3嘛,肯定不会有重复,然后就GG了、、2333.。。。

dp[i][j][k]表示前i个字符,其中倒数第二个为j,倒数第一个为k时,可以组成的方案数。

对于状态的转移,我们有两种解法:对于dp[i]的转移,我们先把源自dp[i-1]的都累加过来,然后看看需要减去多少,这时候枚举去重完的这tot组和弦,对于每一组,分成:三个数都相同;其中两个数相同,三个数都不相同,三种情况,分别进行转移就行了。你如果都直接减6组的话,,那就有可能减多了,样例1就过不了(别问我怎么知道的,吃完饭回来才想出来)。

第二种解法:也是十分简单的,先用三维数组标记三位数是否出现过,直接枚举后三个数[j][k][l],如果没出现过,那就转移;如果出现过就continue。

AC代码1:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
ll dp[505][55][55],dpp[MAX];
int a[MAX],b[MAX],c[MAX],qq[3];
const ll mod = 1e9 + 7;
int tot;
set<pair<int,pair<int,int> > > ss;
int main()
{int n,q;cin>>n>>q;for(int x,y,z,i = 1; i<=q; i++) {scanf("%d%d%d",qq,qq+1,qq+2);sort(qq,qq+3);x=qq[0],y=qq[1],z=qq[2];if(ss.count(pm(x,pm(y,z)))) continue;else a[++tot] = x,b[tot]=y,c[tot]=z,ss.insert(pm(x,pm(y,z)));}for(int i = 1; i<=2; i++) {for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {dp[i][j][k] = 1;}}}for(int i = 3; i<=n; i++) {for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {for(int l = 1; l<=49; l++) {dp[i][j][k] += dp[i-1][l][j];dp[i][j][k] %= mod;}}}
//		memset(dpp,0,sizeof dpp);
//		//求出以i中间的,dpp[i] 
//		for(int j = 1; j<=49; j++) {
//			for(int k = 1; k<=49; k++) {
//				dpp[j] += dp[i-1][k][j];
//			}
//		}for(int e = 1; e<=tot; e++) {int A = a[e],B = b[e],C = c[e];int xx[3];xx[0]=A,xx[1]=B,xx[2]=C;sort(xx,xx+3);A=xx[0],B=xx[1],C=xx[2];if(A==B&&B==C) dp[i][A][B] = (dp[i][A][B]+mod - dp[i-1][C][A])%mod;else if(A==B && B!=C) {dp[i][A][B] = (dp[i][A][B]+mod - dp[i-1][C][A])%mod;dp[i][A][C] = (dp[i][A][C]+mod - dp[i-1][B][A])%mod;dp[i][C][A] = (dp[i][C][A]+mod - dp[i-1][B][C])%mod;}else if(A!=B && B==C) {dp[i][A][B] = (dp[i][A][B]+mod - dp[i-1][C][A])%mod;dp[i][B][A] = (dp[i][B][A]+mod - dp[i-1][C][B])%mod;dp[i][B][C] = (dp[i][B][C]+mod - dp[i-1][A][B])%mod;}else {dp[i][A][B] = (dp[i][A][B]+mod - dp[i-1][C][A])%mod;dp[i][B][A] = (dp[i][B][A]+mod - dp[i-1][C][B])%mod;dp[i][A][C] = (dp[i][A][C]+mod - dp[i-1][B][A])%mod;dp[i][C][A] = (dp[i][C][A]+mod - dp[i-1][B][C])%mod;dp[i][B][C] = (dp[i][B][C]+mod - dp[i-1][A][B])%mod;dp[i][C][B] = (dp[i][C][B]+mod - dp[i-1][A][C])%mod;}}}ll ans = 0;for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {ans = (ans + dp[n][j][k])%mod; }}printf("%lld\n",ans);return 0 ;}
/*
4 1
1 2 3
3 1
1 1 2*/

 

AC代码2:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
ll dp[505][55][55],dpp[MAX];
bool bk[55][55][55];
const ll mod = 1e9 + 7;
int main()
{int n,q;cin>>n>>q;for(int x,y,z,i = 1; i<=q; i++) {scanf("%d%d%d",&x,&y,&z);bk[x][y][z]=1; bk[x][z][y]=1;bk[y][x][z]=1; bk[y][z][x]=1;bk[z][x][y]=1; bk[z][y][x]=1;}for(int i = 1; i<=2; i++) {for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {dp[i][j][k] = 1;}}}for(int i = 3; i<=n; i++) {for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {for(int l = 1; l<=49; l++) {if(bk[j][k][l]) continue ;dp[i][j][k] += dp[i-1][l][j];dp[i][j][k] %= mod;}}}}ll ans = 0;for(int j = 1; j<=49; j++) {for(int k = 1; k<=49; k++) {ans = (ans + dp[n][j][k])%mod; }}printf("%lld\n",ans);return 0 ;}
/*
4 1
1 2 3
3 1
1 1 2*/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java button 圆角_UIButton具有渐变边框和圆角

我想要的是一个自定义UIButton&#xff0c;它有一个渐变边框(只是边框是渐变)和圆角 . 我几乎到了我想去的地方&#xff0c;但是角落有问题 . 这是我目前拥有的&#xff1a;这是我的代码&#xff1a;override func viewDidLoad() {super.viewDidLoad()let gradient CAGradient…

java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项

本文使用jxl.jar工具类库实现读取Excel中指定列的数据。jxl.jar是通过java操作excel表格的工具类库&#xff0c;是由java语言开发而成的。这套API是纯Java的&#xff0c;并不依赖Windows系统&#xff0c;即使运行在Linux下&#xff0c;它同样能够正确的处理Excel文件。支持Exce…

java quartz 数据库_SpringBoot+Quartz+数据库存储

Spring整合Quartza、quartz调度框架是有内置表的进入quartz的官网http://www.quartz-scheduler.org/&#xff0c;点击Downloads&#xff0c;下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本&#xff0c;例如&#xff1a;“tables_mysql.sql”table_mysql.sqltable…

【CodeForces - 1062C】Banh-mi (贪心,数学,找规律,快速幂)

题干&#xff1a; JATC loves Banh-mi (a Vietnamese food). His affection for Banh-mi is so much that he always has it for breakfast. This morning, as usual, he buys a Banh-mi and decides to enjoy it in a special way. First, he splits the Banh-mi into nn pa…

【牛客 - 练习】约数个数的和(数论,数学)

题干&#xff1a; 给个n&#xff0c;求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数&#xff0c;表示答案 示例1 输入 复制 3 输出 复制 5 说明 样例解释&#xff1a; 1有1个约数1 2有2个约数1,2 3有2个约数1,3 备注: n…

mysql json 创建索引_MySQL · 最佳实践 · 如何索引JSON字段

概述MySQL从5.7.8起开始支持JSON字段&#xff0c;这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能&#xff0c;至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段…

mysql链路跟踪工具_EasySwoole利用链路追踪组件制作甩锅工具

前言最近前端老是反馈API调用异常&#xff0c;说请求成功但是没有数据返回&#xff01;我写的代码怎么可能有bug&#xff0c;肯定是前端调用的方式不对&#xff01;经过一番套鼓&#xff0c;直接把请求参数和响应内容打印到控制台&#xff0c;果然不出我所料&#xff0c;请求缺…

java selector 源码_Java NIO核心组件-Selector和Channel

昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现.那今天我们就来介绍一下, Java NIO中的核心组件, Selector和Channel.这两个组件,对于熟悉Java OIO,而不熟悉Java NIO的朋友来说,理解其作用是极…

python 爬虫 博客园_Python爬虫爬取博客园作业

分析一下他们的代码&#xff0c;我在浏览器中对应位置右键&#xff0c;然后点击检查元素&#xff0c;可以找到对应部分的代码。但是&#xff0c;直接查看当前网页的源码发现&#xff0c;里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码&#xff0c;…

java 与 xml_xml与java对象转换

public static void main(String[] args) {//java bean 转 xmlDept d new Dept();List staffs new ArrayList<>();Staff s1 new Staff("wuyun", 20);Staff s2 new Staff("lilei", 22);staffs.add(s1);staffs.add(s2);d.setDeptName("开放平…

【牛客 - 370H】Rinne Loves Dynamic Graph(分层图最短路)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/H 来源&#xff1a;牛客网 Rinne 学到了一个新的奇妙的东西叫做动态图&#xff0c;这里的动态图的定义是边权可以随着操作而变动的图。 当我们在这个图上经过一条边的时候&#xff0c;这个图上所…

中位数及带权中位数问题(转)

先从一到简单的题看起&#xff1a; 士兵站队问题 在一个划分成网格的操场上&#xff0c;n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步&#xff0c;但在同一时刻任一网格点上只能有一名士兵。按照军官的命令&#xff0c;…

*【HDU - 4272 】LianLianKan (dfs 或 状压dp,贪心不行)

题干&#xff1a; I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack. Now we have a number stack, and we should link and pop the same element…

java中的values函数_巧用valueat函数(快逸免费版)

在制作报表时&#xff0c;经常会遇到将数据库里一列数据按照条件取值后&#xff0c;分为多列显示的需求&#xff0c;例如&#xff1a;数据库中有一列名为type的数据&#xff0c;在报表中&#xff0c;第一列选择type为1的数据&#xff0c;第二列选择type为2的数据。由于受到扩展…

Java设计流程执行器_Java进阶面试精选系列:SpringMVC+SpringBoot+Hibernate+Mybatis+设计模式...

小编精心收集&#xff1a;为金三银四准备&#xff0c;以下面试题先过一遍&#xff0c;为即将到了的面试做好准备&#xff0c;也过一遍基础知识点。一、Spring/Spring MVC1.为什么要使用 spring&#xff1f;2.解释一下什么是 aop&#xff1f;3.解释一下什么是 ioc&#xff1f;3.…

【牛客 - 370E】Rinne Loves Gift(Bellman_Ford判负环,二分,分数规划)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/E 来源&#xff1a;牛客网 Rinne 喜欢礼物&#xff0c;也喜欢送礼物 圣诞节快到了&#xff0c;Rinne 要去给给住在城市里的人送礼物 城市的交通可以抽象成一个 n 个点 m 条边的有向图 每条边上有…

【POJ - 2976】【ZOJ - 3068】【SCU - 2992】Dropping tests (01分数规划)

题干&#xff1a; In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cumulative average is defined to be . Given your test scores and a positive integer k, determine how high you can make your cumulative aver…

重写过的url 怎么获取当前页面url java_网站URL重写(Java UrlRewrite 的使用)

现在大部分的网站和商城都会使用到URL重写&#xff0c;接触到这个&#xff0c;也是因为正在做的电子商务商城。URL重写&#xff0c;是将原有的URL采用另一种规则来显示&#xff0c;使得用户方便访问同时也屏蔽一些信息。在此说下它的好处&#xff0c;在开发过程中&#xff0c;经…

Java行业情景分析_Java 设计模式情景分析——单例模式

单例模式可以说是应用最广的模式之一&#xff0c;在应用单例模式时&#xff0c;单例对象的类必须保证只有一个实例存在&#xff0c;而且可以自行实例化并向整个系统提供这个实例。一般在不能自由构造对象的情况下&#xff0c;就会使用单例设计模式&#xff0c;例如创建一个对象…

php实现播放直播_PHP直播技术分享(一:实现直播)

推流服务器采用的是自搭的推流服务器 , 自己玩玩 做外包项目还是去搞七牛云/阿里这样的服务器吧,开始bb-----1:技术栈image.jpeg2:开发中业务(1)主播申请时创建个秘钥 , 这个秘钥随时字符串即可到时候根据字符串找到拉流的直播位置存数据库包括推流地址image.png3:配置nginx-rt…