【ZOJ 5689】Deque and Balls(普通dp)

题意:给出一个序列,按照顺序一个一个放入双端队列(可以放在头部也可以放在尾部),一个队列的美丽指数就是数列中a[i]>a[i+1]的个数,求美丽指数的期望*2^n的值。

解题思路:方便起见,我们将a[i]>a[i+1]的情况称为D情况。

由题意可以知道最后得到的序列一共有2^(n-1)个,设ans=所有序列中D情况个数的总和,最后就是求sum/2^(n-1)*2^n = 2*sum

对于将要插入的a[j],sum=原先的D情况总和*2+a[j]产生的D情况-(a[i]=a[j])的情况

如果a[j]跟a[i]相邻,那么a[i+1……j-1]只能放在与a[i]相异的一端,那么出现D情况的序列一共有2^(i-2)个

所以a[j]的D情况一共有 1+∑2^(i-2) (2<=i<j)

a[i]=a[j]的情况跟求j的思路类似

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int N=1e5+10;
 5 const ll mod=1e9+7;
 6 int a;
 7 ll f[N], sum[N], dp[N], p[N];
 8 int main(){
 9     f[0]=1, f[1]=1, sum[0]=1, sum[1]=2;
10     for(int i=2; i<N; i++) f[i] = (f[i-1]*2)%mod, sum[i] = (sum[i-1]+f[i])%mod;
11
12     int t, n;
13     scanf("%d", &t);
14     while(t--){
15         memset(p, 0, sizeof(p));
16         scanf("%d", &n);
17         dp[0] = 0, dp[1] = 0;
18         for(int i=1; i<=n; i++){
19             scanf("%d", &a);
20             if(i>1) dp[i] = ((dp[i-1]*2)%mod + sum[i-2] - p[a] + mod)%mod;
21             p[a] = (p[a]+f[i-1])%mod;
22         }
23         printf("%lld\n", (dp[n]*2)%mod);
24     }
25     return 0;
26 }
时间: 2024-10-13 23:51:53

【ZOJ 5689】Deque and Balls(普通dp)的相关文章

期望+DP ZOJ 3929 Deque and Balls

题目链接 题意:给你n个数,按照顺序依次放入一个双端队列(可放在头部,也可以放在尾部),求xi > xi+1的期望 * 2^n mod (1e9 +7) 分析:期望*2^n=出现这种排法的概率*这种排法的desents数

ZOJ-3929 Deque and Balls (DP+找规律)

题目大意:n个数,每个数的大小都在1~n之间.操作n次,第 i 次将第 i 个数放到一个双端队列里面,放到队列两端的概率是相等的.问操作n次之后双端队列中元素满足xi>xi+1的对数的期望,输出的数据为:(期望*2^n)%mod. 题目分析:定义状态dp(i)表示操作 i 次之后的相应期望值.则状态转移方程为: dp(i)=1/2*(dp(i-1)+k1)+1/2*(dp(i-1)+k2)  (两种情况,放在队首和队尾) 其中,k1表示比a(i)小的元素可能与a(i)相邻的总次数,k2表示比a(

ZOJ 3929 Deque and Balls

期望=所有情况中总共递减次数*2 放完i个和放完i-1个之间的递减次数是可以递推的. 有一部分是放完i-1个之后产生的,还有一部分是放完第i个之后新产生的. 注意减去多加的部分. 2的i次方可以打个表,然后就再开一个sum预处理2的i次方的前缀和,就可以递推了. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const i

zoj 3929 Deque and Balls(需要思考的递推)

思路参考自: http://blog.csdn.net/doris1104/article/details/51126910 thanks 找规律发现  最后一个球和前面球相邻的次数(满足 左边大于右边的)  和 2^ 两个球的间距 有关 ----->越靠近相邻次数越多. 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 5 #include<string> 6 #include&

ZOJ 3471 Most Powerful 状压DP

水题,一维的DP,表示还剩哪些atom的时候能获得的最大能量 #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <queue> #include <deque> #include <

ZOJ 2109 FatMouse&#39; Trade (背包 dp + 贪心)

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109 FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J

ZOJ 3644 Kitty&#39;s Game(DP)

Description Kitty is a little cat. She is crazy about a game recently. There are n scenes in the game(mark from 1 to n). Each scene has a number pi. Kitty's score will become least_common_multiple(x,pi) when Kitty enter the ith scene. x is the score

ZOJ 3469 Food Delivery(区间DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255 题意:n个人订餐.n个人位于一条线上,饭店也在这条线上.每个人有一个脾气值p.若第i分钟得到他预定的饭不满意度为p*i.送饭人的速度已知.求一种送饭顺序使得总不满意度最小. 思路:设f[i][j][0],f[i] [j][1]分别表示将[i,j]区间的送完,最后停在左边或右边的最小不满意度.那么我们在DPf[i][j][0]时可以从f[i+1][j]进行转 移

ZOJ 1743 Concert Hall Scheduling(DP)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=743 题意:有两个音乐厅出租.给出n个租客,每个租客有个租的时间段[L,R],以及租费.任意时候音乐厅只能租给最多一个租客.问如何选择租给哪些租客使得赚的钱最多? 思路:f[i][j]表示第一个音乐厅到时刻i.第二个到时刻j,可以获得的最大值. struct node { int x,y,w; int operator<(const node &a) const