HAOI2008 木棍分割

2022-03-27 05:32:57 字數 1055 閱讀 8872

沒寫過幾道的字首和優化\(dp\)

第一問是小學生難度的二分

第二問就直接\(dp\)了

設\(dp[i][j]\)表示當前分割點在\(i\)之後,前面一共分割了\(j\)段的方案數

利用字首和單調性,通過二分預處理出每乙個點往前能擴充套件到的最大位置,之後字首和優化就可以啦

但是發現這個樣子空間會炸,而這個樣子還沒有辦法滾動起來

那好辦交換一下狀態的順序就可以啦,就可以字首和/滾動陣列優化了

**

#include#include#include#define re register

#define maxn 50005

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

const int mod=10007;

int a[maxn],n,m;

int dp[2][maxn],pre[2][maxn];

int p[maxn],to[maxn];

int ans;

inline int read()

inline int check(int x)

return tot<=m;

}inline int find(int l,int r,int now)

return t;

}int l,r;

int main()

printf("%d ",ans);

for(re int i=1;i<=n;i++)

to[i]=find(0,i-1,i)+1;

for(re int i=1;i<=n;i++) if(p[i]<=ans) dp[0][i]=1;

for(re int i=1;i<=n;i++) pre[0][i]=pre[0][i-1]+dp[0][i];

int o=0,cnt=0;

cnt=(cnt+dp[0][n])%mod;

for(re int i=2;i<=m+1;i++,o^=1)

printf("%d\n",cnt);

return 0;

}

木棍分割 HAOI2008

有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並將結果mod 10007。輸入檔案第一行有2個數n,m.接下來n...

HAOI2008 木棍分割

description 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連線處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長度最大的一段長度最小.並將結果mod 10007。input 輸入檔...

題解 HAOI2008木棍分割

對於這道題目的兩問,第一問直接二分答案求出最短長度。關鍵在於第二問應當如何求 建立dp方程,dp i j 代表到第i個分界線,切了j次 強制在第i處切一刀 這樣就不會對後面的狀態產生影響 狀態轉移的方程即是當前分界線列舉上一條分界線在 上一條分界線與當前線之間如果相差不超過之前二分出來的答案,就可以...