【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]\)表示涂好\(i\sim 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\n",t[1].sum);
	}
    return 0; 
}

luogu4934 礼物

\(A\&B\ge min(A,B)\)得这是一个包含关系即\(A\subseteq 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\)\(b\in 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\n",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\)

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

posted @ 2019-10-07 19:17  委屈的咸鱼鱼鱼鱼  阅读(308)  评论(0编辑  收藏  举报