BZOJ1996 [Hnoi2010]chorus 合唱队】的更多相关文章

http://www.lydsy.com/JudgeOnline/problem.php?id=1996 f[i][j][0/1] 表示已经排出队形中的[i,j],最后一个插入的人在[i,j]的i或j 枚举顺序一: 先枚举区间长度,再枚举区间左端点 枚举顺序二: 先倒序枚举区间左端点,再枚举区间右端点 初始化: 当长度为2时,转移方程中的j==i+1,i==j-1 令f[i][j]只累加一次,所以f[i][i][0]=1 或者是 f[i][i][1]=1都行 #include<cstdio>…
很容易想到区间DP 然后发现这个区间只和圆序列的最后一个数有关,而原序列的最后一个数只可能是现在区间的头或者尾 令$f[i][j][0/1]$表示在区间$[i, j]$之间,原序列的最后一个数是当前区间的头/尾的总答案数 于是只要讨论$a[i], a[i + 1], a[j - 1], a[j]$之间的关系搞一搞就可以了 /************************************************************** Problem: 1996 User: raus…
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用Dev赛高!一道蛮水的区间DP 很容易发现,当前要放进来的人只和已经排出的队伍的两端的大小关系有关就很容易设计状态表示f[x][y][0/1]表示当前已经排好[x,y],且这次放的人在最左/最右边答案即为f[1][n][0]+f[1][n][1] 初始化状态要设f[i][i][0]=1答案记得取模…
就是想水一发 #include <stdio.h> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; ; ]; ll dp[][][]; int main() { int n; scanf("%d", &n); ; i <= n; i++) scanf(] = ; ; len <= n; len++) { ; i…
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT 题解:用f[i][j][0/1]表示从i开始往后j个人,最后一个人是i/i+j-1,的方案数.$O(n^2)$DP即可. #include <cstdio> #include <cstring> #include <iostream> using n…
这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(…
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep(i,n) for(int i=0;i<n;++i) #define clr(x,c) memset(x,c,sizeof(x…
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2088  Solved: 1371[Submit][Status][Discuss] Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source   [Submit][Status][Discuss] HOME Back 最讨厌统计方案…
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行操作,这很容易让我们想到一种区间dp的模型... dp[i][j]表示区间[i,j]已经匹配上了的方案数,因为我们需要知道上一个填的数是什么所以多加一维, dp[i][j][0]表示最后填的数在区间左边,dp[i][j][1]表示最后填的数在区间右边, 这样我们可以确切的知道上一个填的数.... 那…
合唱队 区间DP f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数 边界: f[i][i][0]=1 转移: f[l][r][0]=(a[l]<a[l+1]?f[l+1][r][0]:0)+(a[l]<a[r]?f[l+1][r][1]:0); f[l][r][1]=(a[r]>a[l]?f[l][r-1][0]:0)+(a[r]>a[r-1]?f[l][r-1][1]:0); #include<iostream> #…