沒寫過幾道的字首和優化\(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處切一刀 這樣就不會對後面的狀態產生影響 狀態轉移的方程即是當前分界線列舉上一條分界線在 上一條分界線與當前線之間如果相差不超過之前二分出來的答案,就可以...