题目链接

题目大意

给你一个数字n和长为n-1个字符串

字符串包含'<','>'

若s[i]='<' 则代表a[i]<a[i+1]

若s[i]='>' 则代表a[i]>a[i+1]

你要构造一个长度为n的全排列,使其满足条件

求方案数mod 1e9+7

题目思路

这个问题主要就是不知道如何保证自己构造的数组是一个全排列

又是一个神仙dp,

设\(dp[i][j]\)代表[1,i]为全排列,且第i个元素为j

那么该怎么转移。

若为'<' \(dp[i][j]=\sum_{t=1}^{t=j-1} dp[i-1][t]\)

若为‘>’ \(dp[i][j]=\sum_{t=j}^{t=n} dp[i-1][t]\)

这个转移实属神奇,把j放到i-1个全排列后面,然后前i-1中大于等于j的元素全部加1即可

这样前i个元素又满足全排列,最后一个元素还是j,满足转移方程

然后前缀和优化即可,注意j<=i

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=3e3+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-10;
int n,flag[maxn];
char s[maxn];
ll dp[maxn][maxn],pre[maxn][maxn];
int main(){
scanf("%d %s",&n,s+1);
for(int i=1;i<=n-1;i++){
if(s[i]=='<'){
flag[i]=1;
}else{
flag[i]=0;
}
}
dp[1][1]=1;
for(int i=1;i<=n;i++){
pre[1][i]=1;
}
for(int i=2;i<=n;i++){
for(int j=1;j<=n;j++){
if(j>i){
pre[i][j]=pre[i][j-1];
continue;
}
if(flag[i-1]){
dp[i][j]=pre[i-1][j-1]%mod;
}else{
dp[i][j]=((pre[i-1][n]-pre[i-1][j-1])%mod+mod)%mod;
}
pre[i][j]=(pre[i][j-1]+dp[i][j])%mod;
}
}
printf("%lld\n",pre[n][n]);
return 0;
}

T - Permutation 题解(思维+dp)的更多相关文章

  1. D - Number of Multisets 题解(思维dp)

    题目链接 题目大意 给你一个数k和n,表示用n个\(1/2^i(i=0,1,2.....)\)组成k有多少种方案数 题目思路 这个dp实属巧妙 设\(dp[i][j]表示i个数构成j\) 这i个数可以 ...

  2. [JZOJ5280]膜法师题解--思维+前缀和

    [JZOJ5280]膜法师题解--思维+前缀和 题目链接 暴 力 过 于

  3. Codeforces Global Round 2 E. Pavel and Triangles(思维+DP)

    题目链接:https://codeforces.com/contest/1119/problem/E 题意:有n种长度的棍子,有a_i根2^i长度的棍子,问最多可以组成多少个三角形 题解:dp[i]表 ...

  4. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  5. Blocks题解(区间dp)

    Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方 ...

  6. hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解

    题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...

  7. 模拟赛 提米树 题解 (DP+思维)

    题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...

  8. HDU 3811 Permutation 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...

  9. HDU3811 Permutation —— 状压DP

    题目链接:https://vjudge.net/problem/HDU-3811 Permutation Time Limit: 6000/3000 MS (Java/Others)    Memor ...

随机推荐

  1. Win32之创建线程

    0x01.什么是线程? 1.线程是附属在进程上的执行实体,是代码的执行流程 进程 本身是空间上的概念,代表4GB的虚拟内存,线程代表着时间概念,也就是说,线程是当前运行的代码 在某个时间点只能有一段代 ...

  2. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  3. 使用painless将ElasticSearch字符串拆分为数组

    一.实现场景: ES字符串类型字段imgs,有些历史数据是用逗号分隔的字符串,需要将历史数据拆分为数组形式. 示例: 1.构造测试数据: 创建索引并推送几条典型的历史数据,涵盖以下几种情况: 逗号分隔 ...

  4. 基于tensorflow的文本分类总结(数据集是复旦中文语料)

    代码已上传到github:https://github.com/taishan1994/tensorflow-text-classification 往期精彩: 利用TfidfVectorizer进行 ...

  5. 水题挑战4: luogu P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为 \(n\) 分钟,从 ...

  6. CF1324B

    感觉 \(O(tn^2)\) 不是正解,于是弱弱的发了一波 \(O(tn)\) . 题意描述 你谷还没有人翻译,这里就简单介绍一下. 给你一个长为 \(n\) 的序列,如果它的一个长度至少为 \(3\ ...

  7. 已经编译安装的nginx/tenginx编译增加新模块

    只适用于自行编译安装的nginx配置 业务变更带来的Nginx增加模块需求 由于业务从php转为go开发,需要用到Http2的协议.这种协议在Nginx上需要http_v2_module这个模块的支持 ...

  8. Docker(6)- docker info 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 显示 Docker 系统信 ...

  9. Newton插值的C++实现

    Newton(牛顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗日)插值法.其重点在于差商(Divided Difference)表的求解. 步骤1. 求解差商表,这里采用非递归法(看 ...

  10. Python专题之详解enumerate和zip

    enumerate 第一个是枚举函数. 在我们的日常编程过程中,我们经常遇到一个问题. 在C语言和一些古老的语言中没有迭代器的概念,所以当我们想要遍历数组或容器时,我们只能使用下标.使用迭代器,我们的 ...