==老年选手康复训练
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
- 一个波动数列的子序列仍未波动序列
- 一个波动数列内数字(x)与(x+1)不相邻 那么他俩交换该数列仍为波动数列
- 一个([1,x])的波动数列可映射到一个([y-x+1,y])的波动数列 如,将数列中的(A_i)变为((N+1)-A_i)
- 波动数列有对称性 (1,5,2,4,3 3,4,2,5,1)
证明啥的感性理解就好==