HDU 2829 Lawrence dp 斜率優化

2021-07-13 21:10:35 字數 950 閱讀 5396

題意:一段直線上有n個點,每個點有乙隻價值,一條鐵路的價值等於每兩個點(可以直接或者間接相連,就是聯通路上是否有炸彈把路給炸了)積的和;

思路:斜率優化

dp[i][j]為前i個點,炸j個線段能破壞的最大值

沒優化前的狀態轉移方程為dp[i][x]=max  x-1

設計算點i時,j比k的值優,

dp[k][x-1]+sum[k]*(sum[i]-sum[k])<=dp[j][x-1]+sum[j]*(sum[i]-sum[j])

整理化簡

((sum[j]*sum[j]-dp[j][x-1])-(sum[k]*sum[k]-dp[k][x-1]))/(sum[j]-sum[k])<=sum[i]

令yj=sum[j]*sum[j]-dp[j][x-1] 

xj=sum[j]

則式子變為(yj-yk)/(xj-xk)<=sum[i]

令g[j,k]=(yj-yk)/(xj-xk)

因為a[i]為正數所以sum[i]單調遞增

當有g[j,k]<=sum[i]滿足時,說明j比k優,而sum[i]單調遞增所以比k可以淘汰

另外如果kg[i,j] 則j可以淘汰

因為如果g[i,j]

而如果g[i,j]>sum[i]則g[j,k]>sum[i] 則說明k比j優所以j也被淘汰,綜上j被淘汰

用乙個佇列可以維護乙個小區間來確定i的時候需要確定的j值

**:#include#include#include#includeusing namespace std;

#define maxn 1111

int n,m;

int a[maxn];

int sum[maxn];

int dp[maxn][maxn];

int tot;

int gg[maxn];

//dp[i][x]=max x-1g[j,i] (k

282 inflate方法使用

inflate方法使用 之前一直以為view.inflate方法就像乙個轉化器一樣 把layout資源檔案轉化為view 比如說imageview iv view.inflate context,r.layout.imageview,null 原來出現了很大的誤解 比如這樣 linearlayout...

282 石子合併

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...

28 2 logging 日誌模組

功能 1.日誌格式的規範 2.操作的簡化 3.日誌的分級管理 logging不能幫你做的事情 自動生成你要列印的內容 需要程式設計師自己在開發的時候定義好 在哪些地方需要列印,要列印的內容是什麼,內容的級別 logging模組的使用 普通配置型 簡單的 可定製化差 物件配置型 複雜的 可定製化強 一...