zoukankan      html  css  js  c++  java
  • Beautiful Sequence

    Beautiful Sequence

    给定一些数(可能相同),将它们随机打乱后构成凹函数,求概率 。N<=60 。

    首先,这种题求概率事实上就是求方案。所以现在要求的是用这些数构成凹函数的方案数。

    依稀记得上次的一道考试题,只是把凹函数变成了一个具有特殊性质的单调序列而已。这道题也是一样,由于它不关心数的位置,所以把数排序以后,可以统计把当前数插入凹函数的方案。

    exp1:与数的位置无关的计数题可以考虑排序。

    (f[i][j][k][l])表示凹函数最左边的两个点,最右边的两个点。那么新来的一个点要么在最左边,要么在最右边,转移即可。

    有人可能会问:怎么维持转移顺序啊。没关系,我们钦定i是最高的点。那么我们可以把第二个转移方程写成(f[i][j][k][l]->f[i][j][l][i+1]=f[i+1][l][j][i])就行了。是不是很妙。

    exp2:对于某些状态具有对称性的题,可以考虑把状态的某一维钦定成按顺序转移的维度。这样就好dp了。

    #include <cstdio> 
    #include <algorithm>
    using namespace std;
    
    const int maxn=62, mod=1e9+7;
    int n, b[maxn], a[maxn], m, ans, c;
    int f[maxn][maxn][maxn][maxn];
    
    bool ok(int x, int y, int z){ return 2*a[y]<=a[x]+a[z]; }
    void up(int &x, int y){ x+=y; if (x>mod) x-=mod; }
    
    int main(){
    	scanf("%d", &n);
    	for (int i=1; i<=n; ++i) scanf("%d", &b[i]);
    	sort(b+1, b+n+1); ++c;
    	for (int i=2; i<=n; ++i) if (b[i]==b[1]) ++c; else break;
    	for (int i=c; i<=n; ++i) a[++m]=b[i]; n=m;
    	f[1][1][1][1]=1;
    	for (int i=1; i<=n; ++i)
    	for (int j=1; j<=n; ++j)
    	for (int k=1; k<=n; ++k)
    	for (int l=1; l<=n; ++l){
    		if (ok(i+1, i, j)) up(f[i+1][i][k][l], f[i][j][k][l]);
    		if (ok(i+1, l, k)) up(f[i+1][l][j][i], f[i][j][k][l]);
    		if (i==n||l==n) up(ans, f[i][j][k][l]);
    	}
    	for (int i=1; i<=c; ++i)
    		ans=(long long)ans*i%mod;
    	printf("%d
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    在HTML5中,用getCurrentPosition()获取用户的当前位置
    邮件设置 ssl://smtp.exmail.qq.com:465 can not connect to the SMTP server
    IIS绑定中文域名
    destoon 会员状态栏不显示
    汉诺塔的移动--python递归实现
    微星 msi B450迫击炮+2600X+RX588 3A平台装机
    正则表达式-1
    接口--php对接农行网上支付平台-b2b
    python----字符串操作函数
    php面试题--1
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9476783.html
Copyright © 2011-2022 走看看