• 【2019.9.30】Za


    ==老年选手康复训练

    poj1050

    ==我是个瘟桑吧 最大子段和我居然还得重新撕烤一遍

    dp[0]=0;
    for(int i=1;i<=n++i) dp[i]=max(dp[i-1]+a[i],a[i]);
    for(int i=1;i<=n;++i) ans=max(ans,dp[i]);
    

    本题把把二维降为一维的最大子段和

    	for(int i=1;i<=n;++i)
    		for(int j=1,sum;j<=n;++j){
    			sum=0;
    			for(int k=j;k<=n;++k)
    				sum+=a[i][k],f[i][j][k]=Max(f[i-1][j][k]+sum,sum),ans=Max(f[i][j][k],ans);
    		}
    

    POJ1063

    ==找规律

    CQOI2007 染色

    很容易想到是区间dp

    (f[i,j])表示涂好(isim j)这个区间最少操作次数 若(i)(j)的颜色相同 那么可以并为一次操作

    	memset(f,inf,sizeof(f));
    	for(int i=1;i<=n;++i) f[i][i]=1;
    	for(int len=2;len<=n;++len)
    		for(int i=1,j=len;j<=n;++i,++j)
    			if(a[i]==a[j]) f[i][j]=Min(f[i+1][j],f[i][j-1]);
    			else
    				for(int k=i;k<j;++k) f[i][j]=Min(f[i][j],f[i][k]+f[k+1][j]);
    	printf("%d",f[1][n]);
    

    楼房重建

    ==很容易想到维护斜率

    这个pup很巧妙

    struct node{int sum;double k;}t[N<<2];
    int query(int o,int l,int r,double k){
    	if(t[o].k<=k) return 0;
    	if(l==r) return t[o].k>k;
    	int mid=l+r>>1;
    	if(t[ls].k<=k) return query(rs,mid+1,r,k);
    	else return query(ls,l,mid,k)+t[o].sum-t[ls].sum;
    }
    void pup(int o,int l,int r){
    	t[o].k=Max(t[ls].k,t[rs].k);
    	t[o].sum=t[ls].sum+query(rs,((l+r)>>1)+1,r,t[ls].k);
    }
    void upd(int o,int l,int r,int x,double k){
    	if(l==r){t[o]=(node){1,k};return;}
    	int mid=l+r>>1;
    	if(x<=mid) upd(ls,l,mid,x,k);
    	else upd(rs,mid+1,r,x,k);
    	pup(o,l,r);
    }
    
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif
    	rd(n),rd(m);
    	for(int i=1,x,y;i<=m;++i){
    		rd(x),rd(y);
    		upd(1,1,n,x,(double)y/x);
    		printf("%d
    ",t[1].sum);
    	}
        return 0; 
    }
    

    luogu4934 礼物

    (A&Bge min(A,B))得这是一个包含关系即(Asubseteq B) ==其实对于这个式子他俩就包含或者不包含 若不包含的话(A&B< min(A,B)) (寄几想一想==

    偏序集:

    (P)是集合,(P)上的二元关系“(≤)”满足以下三个条件,则称“(≤)”是(P)上的偏序关系(或部分序关系):
    (1)自反性:(a≤a , ∀a∈P)
    (2)反对称性:(∀a,b∈P),若(a≤b)(b≤a),则(a=b)
    (3)传递性:(∀a,b,c∈P),若(a≤b)(b≤c),则(a≤c)
    具有偏序关系的集合(P)为偏序集(或称半序集),记为((P,≤))(a≤b)读作“(a)小于或等于(b)”或“(a)含于(b)”,(a<b)读作“(a)小于(b)”或“(a)真含于(b)”。这里(a<b)等价于(a≤b)(a≠b)(∀a)(bin P)。若(a≤b)(b≤a),则称(a)(b)是可比的,否则就说(a)(b)是不可比。(a)(b)不可比记作(a||b)

    在X中,对于元素a,如果任意元素b,由b≤a得出b=a,则称a为极小元。
    一个反链A是X的一个子集,它的任意两个元素都不能进行比较。
    一个链C是X的一个子集,它的任意两个元素都可比。

    定理1 令((X,≤))是一个有限偏序集,并令(r)是其最大链的大小。则(X)可以被划分成(r)个但不能再少的反链。
    其对偶定理称为(Dilworth)定理:
    定理2 令((X,≤))是一个有限偏序集,并令(m)是反链的最大的大小。则(X)可以被划分成(m)个但不能再少的链

    dp做法

    	rd(n),rd(K);puts("1");
    	for(int i=1,x;i<=n;++i) rd(x),vis[x]=1;
    	for(int i=0;i<(1<<K);++i){
    		for(int j=i;j;j^=(j&-j)) f[i]=Max(f[i],f[i^(j&-j)]);
    		if(vis[i]) q[++f[i]].push_back(i);
    	}
    	printf("%d
    ",f[(1<<K)-1]);
    	for(int i=1,sz;i<=f[(1<<K)-1];++i){
    		printf("%d ",sz=q[i].size());
    		while(!q[i].empty()) printf("%d ",q[i].back()),q[i].pop_back();
    		puts("");
    	}
    

    [SDOI2010]地精部落

    求有多少个波动数列

    一个性质dp

    1. 一个波动数列的子序列仍未波动序列
    2. 一个波动数列内数字(x)(x+1)不相邻 那么他俩交换该数列仍为波动数列
    3. 一个([1,x])的波动数列可映射到一个([y-x+1,y])的波动数列 如,将数列中的(A_i)变为((N+1)-A_i)
    4. 波动数列有对称性 (1,5,2,4,3 3,4,2,5,1)

    证明啥的感性理解就好==

  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11605150.html
Copyright © 2020-2023  润新知