【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
- 一个波动数列的子序列仍未波动序列
- 一个波动数列内数字\(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\)
证明啥的感性理解就好==