題目鏈接
給n個區間\((n\leq 200)\),選擇其中一些并分成兩部分,要求兩部分的區間分別并起來之后兩者沒有交集,求此時含區間數量少的一部分數量最大為多少。另外,對于每個區間,求出它必須選時的答案
神奇的DP(為什么我有網絡流的思路的題都是DP啊qwq)
先離散化自不必說,設離散化后最遠覆蓋到了len位置
\(cnt[i][j]\):完整的處于\([i,j]\)里的區間個數
\(pre[i][j]\):在區間[1,i]中,A選擇了j個區間時,B最多可以選擇的區間個數
\(las[i][j]\):在區間[i,len]中,A選擇了j個區間時,B最多可以選擇的區間個數
對于完整的一塊,我們可以將它扔在A或者B,這就成了我們的決策,于是得到了轉移方程:
pre[i][j]=max(pre[k][j]+cnt[k][j],pre[k][j-cnt[k][j]])//分別代表將[k,j]這一塊扔到B或者A(las同理)
于是ans1=max(min(i,pre[len][i]))//前者是A中的區間數,后者是此時的B中的區間數,兩者需要取min
接下來處理強行選擇c號區間的情況
對于每一個c,枚舉一個塊[i,j],這個塊必須選,且這個塊包含了c號區間,假設它在A中?,F在還需要知道[1,i]和[j,len]這兩部分怎么選擇,假設在這兩部分中A分別選擇了x,y個區間,于是得到\(n^5\)的方法:
\(ans=max(min(x+y+cnt[i][j],pre[i][x]+las[j][y]))\)//前為A,后為B
一個顯然的優化就是,我們這樣做一次就可以把所有的情況處理出來(上面的四重循環與c無關),我們設ans[i][j]表示強制選擇[i,j]時的答案,復雜度降至\(n^4\)
另外,當x增大時,如果y也隨之增大,此時pre[i][x]+las[j][y]顯然只會變小,此時無法更新答案,所以y只能減小,即y隨著x增大而減小。我們在無法更新答案的時候將y減1即可
#include<bits/stdc++.h>#define N 405 #define re register#define Max(x,y) ((x)>(y) ? (x):(y))using namespace std;int n,ccf,l[N],r[N],cnt[N][N];int pre[N][N],las[N][N];//cnt[i][j]表示完全包含在[i,j]的區間個數 //pre[i][j]表示在時間[1,i],A場選擇j個區間時B場選擇最多的區間個數 int ans[N][N];//[i,j]區間必選時的答案 int b[N<<1],len;template <class T>void read(T &x){ char c;int sign=1; while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48; while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;}int main(){ read(n); for(re int i=1;i<=n;++i) { int t; read(l[i]);read(t); r[i]=l[i]+t; b[++len]=l[i]; b[++len]=r[i]; } sort(b+1,b+len+1); len=unique(b+1,b+len+1)-b-1; for(re int i=1;i<=n;++i) { l[i]=lower_bound(b+1,b+len+1,l[i])-b; r[i]=lower_bound(b+1,b+len+1,r[i])-b; } for(re int i=1;i<=len;++i) for(re int j=i;j<=len;++j) for(re int k=1;k<=n;++k) if(i<=l[k]&&r[k]<=j) cnt[i][j]++; memset(pre,-50,sizeof(pre)); memset(las,-50,sizeof(las)); for(re int i=1;i<=len;++i) { pre[i][0]=cnt[1][i]; for(re int j=1;j<=cnt[1][i];++j) for(re int k=1;k<=i;++k) { pre[i][j]=Max(pre[i][j],pre[k][j]+cnt[k][i]);//[k,i]分給B if(j>=cnt[k][i]) pre[i][j]=Max(pre[i][j],pre[k][j-cnt[k][i]]);//[k,i]分給A } } for(re int i=len;i>=1;--i) { las[i][0]=cnt[i][len]; for(re int j=1;j<=cnt[i][len];++j) for(re int k=i;k<=len;++k) { las[i][j]=Max(las[i][j],las[k][j]+cnt[i][k]); if(j>=cnt[i][k]) las[i][j]=Max(las[i][j],las[k][j-cnt[i][k]]); } } ccf=0; for(re int i=0;i<=n;++i) ccf=Max(ccf,min(pre[len][i],i)); printf("%d\n",ccf); for(re int i=1;i<=len;++i) { for(re int j=1;j<=len;++j) { ans[i][j]=-10000; int y=cnt[j][len]; for(re int x=0;x<=cnt[1][i];++x)//A在[1,i]區間選擇了x個 { int p,q; for(;y>=0;--y) { p=min(x+y+cnt[i][j],pre[i][x]+las[j][y]); if(!y) break; q=min(x+y-1+cnt[i][j],pre[i][x]+las[j][y-1]); if(q<p) break; } ans[i][j]=Max(ans[i][j],p); } } } for(re int i=1;i<=n;++i) { ccf=0; for(re int j=1;j<=l[i];++j) for(re int k=r[i];k<=len;++k) ccf=Max(ccf,ans[j][k]); printf("%d\n",ccf); } return 0;}
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
怎么解壓tar文件?有三種解壓方法,如下所示:1。最簡單的壓縮命令:winraraasdf.txt.rar文件asdf.txta公司第一個參數是壓縮文件名,后綴是tar,最后一個參數是要壓縮的文件名。2. 最簡單的解壓命令:WinRAR easdf.txt.txt文件意思是減壓。解壓后的文件是后面唯一的參數。但是這個e解壓是將解壓后的文件釋放到當前目錄asdf.txt.rar文件文件并置,因此,更...
mask是什么牌子的面膜?泰國ele品牌下的美好夜晚。睡眠面膜,面膜品牌,全稱為51Mask,是知名的新概念全效面膜品牌。該面膜品牌采用全球最先進的物理納米原理和電磁真空技術,提出“一片面膜即可全面呵護肌膚”的護膚理念。51Mask翻譯成中文就是“我要一個面膜”,深刻詮釋了對美的熱愛,表達了每個人都應該有對美麗肌膚的追求。mask固體清潔面膜可靠嗎?面膜真的可以去黑頭。持久保濕,滲透力強。使用后可...
太多HTTP重定向,怎么解決?退出app store,從Apple mobile phone中打開[settings],然后下拉界面找到[iTunes store and app store]選項,點擊open,然后點擊[app store]的personal account選項。然后,在彈出窗口中,單擊[注銷]按鈕。注銷后,長按手機電源按鈕,即可關閉手機并重新啟動。然后輸入設置并再次登錄Appl...