連線
題意:有n個矩形,隨意分成幾組,使得花費最小,每組的花費是該組最大的寬度×最大的長度。長和寬不能交換位置。
思路:先貪心地想一下,如果乙個長和寬都很大的需要選的話,那麼長度和寬度比它都要小的都可以 放到這組裡面,不會有任何的額外花費。且分組是隨便分,沒有相鄰之類的限制,那麼可以先排序一下,同時可以刪去那些不會有額外貢獻的矩形。
然後先考慮一下on2
on^2
on2的做法,很容易可以得出dp[
i]=m
in(d
p[i]
,dp[
j]+h
[i]∗
w[j+
1]
)dp[i]=min(dp[i],dp[j]+h[i]*w[j+1])
dp[i]=
min(
dp[i
],dp
[j]+
h[i]
∗w[j
+1])
,h[i]*w[j+1]是j+i到i這段區間的總花費,我這邊是優先長小的,然後寬小的,排序且刪除了沒有貢獻的之後,長遞增,寬遞減。
on^2**:
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1e4+5;
pairp[n]
,st[n]
;ll dp[n]
;int top;
intmain()
sort
(p+1
,p+1
+n);
p[0]
=;top=0;
for(
int i =
1;i <= n;i++
)memset
(dp,
125,
sizeof dp)
; dp[0]
=0;for
(int i=
1;i<=top;i++)}
printf
("%lld\n"
,dp[top]);
return0;
}
對於資料範圍大一些就需要用上斜優化了,轉移方程還是dp[i]=min(dp[i],dp[j]+h[i]*w[j+1])
如果dp[i]可以從dp[j]和dp[k]兩個位置轉移,那麼就有
d p[
i]=d
p[j]
+h[i
]∗w[
j+1]
dp[i]=dp[j]+h[i]*w[j+1]
dp[i]=
dp[j
]+h[
i]∗w
[j+1
] 和 dp[
i]=d
p[k]
+h[i
]∗w[
k+1]
dp[i]=dp[k]+h[i]*w[k+1]
dp[i]=
dp[k
]+h[
i]∗w
[k+1
]如果通過dp[k]轉移會更優,那麼就要有dp[
j]+h
[i]∗
w[j+
1]
>dp
[k]+
h[i]
∗w[k
+1
]dp[j]+h[i]*w[j+1]>dp[k]+h[i]*w[k+1]
dp[j]+
h[i]
∗w[j
+1]>dp
[k]+
h[i]
∗w[k
+1]移項後就是dp[
j]−d
p[k]
w[k+
1]−w
[j+1
]>h[
i]
\frac>h[i]
w[k+1]
−w[j
+1]d
p[j]
−dp[
k]>h[
i]然後利用這個關係以及單調佇列維護一下
優化**:
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1e5+5;
pairp[n]
,st[n]
;ll dp[n]
;int top;
int tb[n]
,fr,bk;
double
cal(
int j,
int k)
intmain()
sort
(p+1
,p+1
+n);
top=0;
for(
int i =
1;i <= n;i++
)fill
(dp,dp+n,
1e18);
dp[0]
=0ll
;for
(int i=
1;i<=top;i++)}
fr=bk=0;
for(
int i=
1;i<=top;i++
)printf
("%lld\n"
,dp[top]);
return0;
}//b = dp[i]
//k = l[i]
//x = r[j+1]
//y = dp[j]
//y = -k * x + b
bzoj1597 土地購買 斜率優化
農夫john準備擴大他的農場,他正在考慮n 1 n 50,000 塊長方形的土地.每塊土地的長寬滿足 1 寬 1,000,000 1 長 1,000,000 每塊土地的 是它的面積,但fj可以同時購買多快土地.這些土地的 是它們最大的長乘以它們最大的寬,但是土地的長寬不能交換.如果fj買一塊3x5的...
斜率優化dp bzoj 1597 土地購買
最近學習斜率優化!然而其實並不明白斜率是如何操作的 還好有小天使帶我 而且斜率優化好像是有模板的樣子,很多題都可以套用模板。基本的dp方程 dp i min dp j land.x i land.y j 1 include include include using namespace std st...
bzoj 1597 土地購買(斜率優化dp)
題目戳這裡 2102912 kamisama123 1597 accepted 6076 kb 152 ms c edit 1171 b 2017 06 07 19 44 16 2102894 kamisama123 1597 accepted 6080 kb 160 ms c edit 982 b...