動態規劃 二分 奧運大包圍

2021-06-07 14:27:34 字數 1552 閱讀 5860

題目描述:

為了迎接奧運,市體育局舉行手拉手大包圍活動,開始時n個人手拉手圍成乙個圈。後來這些人中的一些按順序向裡面出圈形成乙個新圈。從而使原圈形成乙個從高到低,最低與最高連線的圈。新圈重複相同的操作,直到沒有人要出圈為止。問最少要形成多少個這樣的圈。

輸入:第一行n個人,第二行輸入n個人的身高(每個身高中用空格隔開)n<=1000

輸出:最少形成多少個這樣的圈。

很容易看出和飛彈攔截的第二問是一樣的模型。。只是多了環

只是我筆算驗證的時候很是不確定,因為樣例都畫不出來。。然後,猥瑣地瞟了一眼討論,大家都是這樣想的,於是乎就打下去了

是那乙個定理,下降子串行的個數等於最長不降子串行的長度。

但是由於有環,因此要列舉斷點,每次都要把s陣列初始化(高度是無限高),s[1]要設成第乙個點然後從第二個點開始遞推,不然沒法遞推下去

提交三次:

1、超時,樸素o(n^3)

2、超時,加了幾個係數優化,無用。

3、ac,改了二分,因為在同乙個大區間內,乙個較短的下降序列和乙個較長的下降序列,(我們只記錄下序列中最高的那個最低的乙個序列),前者中最高的必定比後者最高的矮!因此對於可行性有單調性。

應該說現在二分實現上比較熟了吧,只是可能有些建模,要找出單調性,不知道能力如何

#include #include #include inline long getint()

do rs=(rs<<3)+(rs<<1)+tmp-'0';

while (isdigit(tmp=getchar()));

return sgn?rs:-rs;

}long h[1010];

long s[1010];

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

long maxs = 0;

long height = 0;

long find()

else

}return out;

}int main()

ans = min(ans,maxs);

} printf("%ld",ans);

return 0;

}

樸素:

#include #include #include inline long getint()

do rs=(rs<<3)+(rs<<1)+tmp-'0';

while (isdigit(tmp=getchar()));

return sgn?rs:-rs;

}long h[1010];

long f[1010];

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

int main()}}

} ans = min(ans,_ans);

} printf("%ld",ans);

return 0;

}

動態規劃 最優二分檢索樹

最優二分檢索樹 最優二分檢索樹問題 求一棵使得預期成本最小的二分檢索樹 或是一棵空樹 或者是具有如下性質的非空二叉樹 1 左子樹的所有結點均小於根的值 2 右子樹的所有結點均大於根的值 對於乙個給定的識別符號集合,可能有若干棵不同的二分檢索樹 不同形態的二分檢索樹對識別符號的檢索效能是不同的。設給定...

模擬題 二分 動態規劃 神光

題目描述 亮亮成功地唸出了咒語,石門緩緩地自動移開,一道道絢麗的神光從城堡內激射而出。亮亮好奇而又興奮地走入了城堡中,迎面有一座極長的魔法陣。魔法陣可以看作一條直線,它被均勻地分成了1000000000 1 000 000 000 100000 0000 個位置,乙個位置可以看成是乙個格仔。有些位置...

xjoi 二分查詢 道路規劃

70分 n 2 lis include include include include using namespace std int n,nor 100010 sou 100010 c 100010 q 100010 dp 100010 ans 0 int main for int i 1 i n...