美丽序列(动态规划)
美丽序列
题目描述
牛牛喜欢整数序列,他认为一个序列美丽的定义是
1:每个数都在0到40之间
2:每个数都小于等于之前的数的平均值
具体地说:for each i, 1 <= i < N, A[i] <= (A[0] + A[1] + ... + A[i-1]) / i.
3:没有三个连续的递减的数现在给你一个序列,每个元素是-1到40,你可以将序列中的-1修改成任意的数,求你可以得到多少个美丽序列,答案对1e9+7取模
输入描述:
第一行输入一个整数n (1 ≤ n ≤ 40)第二行输入n个整数
输出描述:
输出一个整数
示例1
输入
2 3 -1
输出
4
示例2
输入
3
5 3 -1
输出
2
示例3
输入
3 -1 0 40
输出
0
示例4
输入
11 -1 40 -1 -1 -1 10 -1 -1 -1 21 -1
输出
579347890
备注:
子任务1: n <= 10 子任务2: n <= 20 子任务3: 无限制
题目链接:https://ac.nowcoder.com/acm/problem/21313
解题思路:
按照动态规划的一般步骤 , 假如 有个序列 ***** 5 我们需要知道 当前数与前一个数的大小关系
AC代码:
#include<string.h>
#include<iostream>
#define Mod 1000000007
using namespace std;
int main(){int n;long long a[42];long long dp[42][42][3][1602];// dp[i][j][1][k]代表当前 处理到第i个且值为j 在递减序列中第 1个前i个和为k memset(dp,0,sizeof(dp));cin>>n;for(int i=1;i<=n;i++)cin>>a[i];//初始化if(a[1]==-1) {for(int i=0;i<=40;i++)dp[1][i][1][i]=1;}else dp[1][a[1]][1][a[1]]=1;for(int i=2;i<=n;i++){if(a[i]==-1){//若当前数为 -1 即可为任何数for(int j=0;j<=40;j++){//枚举当前可能的数 0~40for(int L=0;L<=40;L++){ //枚举当前前一个(i-1)可能的数 0~40for(int k=j*(i-1);k<=1600-j;k++){//枚举前(i-1)个满足条件的和k if(j>=L){//若当前大于前一个数 即打破递减序列的条件 dp[i][j][1][k+j]=(dp[i][j][1][k+j]+dp[i-1][L][1][k])%Mod;dp[i][j][1][k+j]=(dp[i][j][1][k+j]+dp[i-1][L][2][k])%Mod;}else dp[i][j][2][k+j]=(dp[i][j][2][k+j]+dp[i-1][L][1][k])%Mod; }}}}else{//若为具体的大小 for(int L=0;L<=40;L++){//枚举上一个数的大小for(int k=a[i]*(i-1);k<=1600-a[i];k++){//枚举前(i-1)个满足条件的和k if(a[i]>=L){dp[i][a[i]][1][k+a[i]]=(dp[i][a[i]][1][k+a[i]]+dp[i-1][L][1][k])%Mod;dp[i][a[i]][1][k+a[i]]=(dp[i][a[i]][1][k+a[i]]+dp[i-1][L][2][k])%Mod;}else dp[i][a[i]][2][k+a[i]]=(dp[i][a[i]][2][k+a[i]]+dp[i-1][L][1][k])%Mod;}}}}long long sum=0;for(int j=0;j<=40;j++){//枚举 可能的大小for(int k=j*n;k<=1600;k++){//枚举可能的和sum=(sum+dp[n][j][1][k])%Mod;//当前数大小为j且在递减位置1 和为k的美丽序列数sum=(sum+dp[n][j][2][k])%Mod;}}cout <<sum<<endl;return 0;
}
美丽序列(动态规划)相关推荐
- 洛谷P2501数字序列 动态规划
题目 题目链接 题解 这道题目我觉得是神题,非常有意思的题目,也挺难做的. 第一问:求最少需要改变的数量 这一问比较简单,之前也见过这种套路. 定义dp[i]dp[i]dp[i]表示aaa序列中a[1 ...
- 51nod_2369 奈芙莲的序列(动态规划)
奈芙莲的序列 Problem Description 有一天可爱的Nephren得到了一个序列,一开始,她取出序列的第一个数,形成一个新的序列B,然后取出序列A的第二个数,放在序列B的最左边或最右边, ...
- 113. Leetcode 674. 最长连续递增序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i]:以下标i为结尾的数组的连续递增的子序列长度为dp[i]. 注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置. 步骤二.推断状 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 【代码随想录】-动态规划专题
文章目录 理论基础 斐波拉契数列 爬楼梯 使用最小花费爬楼梯 不同路径 不同路径 II 整数拆分 不同的二叉搜索树 背包问题--理论基础 01背包 二维dp数组01背包 一维数组(滚动数组) 装满背包 ...
- LeetCode 题解随笔:动态规划(一)
目录 零.前言 一.基础题目 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯[*] 62. 不同路径 63. 不同路径 II 343. 整数拆分[*] 96. 不同的二 ...
- 【SCMS】最短公共母序列的代码实现
前言 其实说起初衷,是之前吾辈的学校开展了个数模比赛,我去帮别人当帮手,当时的B题是基因拼接,D题是污染程度评定 作为ACMer,我当然喜欢B题这种像ACM竞赛题一样感觉的东西,但无奈人家才是参(da ...
- Java动态规划算法从入门的到熟练
文章目录 一.动态规划 1. 定义 2. 基本思想和策略 3. 解题思路 4. 使用情况 二.算法笔记 509. 斐波那契数 1137. 第 N 个泰波那契数 70. 爬楼梯 746. 使用最小花费爬 ...
- LeetCode44 Wildcard Matching
题目: Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single charact ...
最新文章
- 小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法
- 每天一个linux命令(2):cd命令
- C++ BYTE数组转字符串
- Lync Server 2013与OWA的集成
- Java 基本数据类型 sizeof 功能
- 4.2 Tensorflow笔记:池化函数
- 飞鱼知识变现小程序2.5.3源码_小程序功能模块
- SpringSecurity常用登录认证方案
- [转载] gamma函数stiriling公式_数学笔记|特殊函数(1):Gamma函数
- 多参selector
- linux mk文件6,linux_2.6.30.4_Makefile_3--Makefile学习笔记
- 巨人 index.php/user/login,dedecms实现首页顶部会员登陆框的方法
- 计算机毕业论文数据挖掘,数据挖掘论文范文
- 毕业设计——基于STM32的智能家具系统(语音识别控制、步进电机、舵机)
- Echarts正态分布曲线
- linux 进程 网速监控
- 前端项目emoji表情包的使用
- 2021-5-1 【PTA】【L1-6 不变初心数 (15 分)】
- 2022全球新能源与智能汽车供应链创新大会|爱普搜同期项目对接会
- Excel·VBA工作簿拆分所有工作表单独保存