日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

0x58 数据结构优化DP

發(fā)布時(shí)間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 0x58 数据结构优化DP 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

補(bǔ)寫(xiě)一下

poj3171 設(shè)f[i]表示覆蓋L~i的最小花費(fèi),把區(qū)間按左端點(diǎn)排序,枚舉區(qū)間,f[a[i].r]=min{f[a[i].l~(a[top].r-1)]}+a[i].c (當(dāng)然還要和原值比較的)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;struct node{int l,r,d;}a[31000];
bool cmp(node n1,node n2){return n1.r<n2.r;}struct trnode
{int l,r,lc,rc,c;
}tr[210000];int trlen;
void bt(int l,int r)
{int now=++trlen;tr[now].l=l;tr[now].r=r;tr[now].c=(1<<30);tr[now].lc=tr[now].rc=-1;if(l<r){int mid=(l+r)/2;tr[now].lc=trlen+1;bt(l,mid);tr[now].rc=trlen+1;bt(mid+1,r);}
}
void change(int now,int p,int k)
{if(tr[now].l==tr[now].r){tr[now].c=k;return ;}int lc=tr[now].lc,rc=tr[now].rc;int mid=(tr[now].l+tr[now].r)/2;if(p<=mid)change(lc,p,k);else      change(rc,p,k);tr[now].c=min(tr[lc].c,tr[rc].c);
}
int getmin(int now,int l,int r)
{if(tr[now].l==l&&tr[now].r==r)return tr[now].c;int lc=tr[now].lc,rc=tr[now].rc;int mid=(tr[now].l+tr[now].r)/2;if(r<=mid)  return getmin(lc,l,r);else if(mid+1<=l)return getmin(rc,l,r);else return min(getmin(lc,l,mid),getmin(rc,mid+1,r));
}int f[110000];
int main()
{int n,L,R;scanf("%d%d%d",&n,&L,&R);L++,R++;for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].d);a[i].l++,a[i].r++;if(a[i].r<L||R<a[i].l)i--,n--;if(a[i].l<L)a[i].l=L;if(R<a[i].r)a[i].r=R;}sort(a+1,a+n+1,cmp);int top=1; trlen=0,bt(L,R);memset(f,63,sizeof(f));for(int i=L;i<=R;i++){while(top<=n&&a[top].r==i){if(a[top].l==L){if(a[top].d<f[i])f[i]=a[top].d, change(1,i,f[i]);}else {int k=getmin(1,a[top].l-1,a[top].r-1)+a[top].d;if(k<f[i])f[i]=k, change(1,i,f[i]);}top++;}}if(f[R]==f[0])printf("-1\n");else printf("%d\n",f[R]);return 0;
}
poj3171

hdu5542 f[i][j]表示枚舉到第幾個(gè)位置,長(zhǎng)度為j的嚴(yán)格上升序列有多少(注意一定包括第i個(gè)位置)

f[i][j]=∑(k<j&&a[k]<a[j])f[k][j-1] 這里先離散化,然后開(kāi)m個(gè)樹(shù)狀數(shù)組記錄,想想cdq分治,時(shí)間維有序第一個(gè)限制不管,第二個(gè)用樹(shù)狀數(shù)組解決。實(shí)際操作中,是不用定義數(shù)組的,直接插入樹(shù)狀數(shù)組中相應(yīng)位置即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int mod=1e9+7;int lslen;int s[1100][1100];
int lowbit(int x){return x&-x;}
void change(int x,int w,int k)
{while(x<=lslen){s[w][x]=(s[w][x]+k)%mod;x+=lowbit(x);}
}
int getsum(int x,int w)
{int ret=0;while(x>0){ret=(ret+s[w][x])%mod;x-=lowbit(x);}return ret;
}//----------------bit---------------------int a[1100],ls[1100];
int main()
{int T,T_T=0;scanf("%d",&T);while(T--){int n,m;scanf("%d%d",&n,&m);lslen=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]), ls[++lslen]=a[i];sort(ls+1,ls+lslen+1);lslen=unique(ls+1,ls+lslen+1)-ls-1;for(int i=1;i<=n;i++)a[i]=lower_bound(ls+1,ls+lslen+1,a[i])-ls;memset(s,0,sizeof(s));for(int i=1;i<=n;i++){change(a[i],1,1);int li=min(i,m);for(int j=2;j<=li;j++)change(a[i],j,getsum(a[i]-1,j-1));}printf("Case #%d: %d\n",++T_T,getsum(lslen,m));}return 0;
}
hdu5542

?

轉(zhuǎn)載于:https://www.cnblogs.com/AKCqhzdy/p/9468658.html

總結(jié)

以上是生活随笔為你收集整理的0x58 数据结构优化DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。