hdu 4374 dp 單調佇列優化

2021-06-08 15:40:12 字數 1276 閱讀 1451

/*

解法: dp+單調佇列!

有乙個的樓房,從第一層某個位置出發上樓,每次能爬上一層樓也可以在同一層左右移動,

但是在每一層的移動距離不能超過某個值。。現在每個位置都有乙個數值,

求從第一層出發到最後一層經過的路徑上最多能取到的最大價值。

dp[i][j] 表示 第i行,第j個數字的最大價值!

sum[i][j] 表示 第i行 第j個數字的成績和!

那麼 在 j 左邊的資料狀態轉移方程為:

dp[i][j]=min(dp[i-1][k]+sum[i][j]-sum[i][k-1]);

在 j 右邊的資料狀態轉移方程為:

dp[i][j]=min(dp[i-1][k]-sum[i][j-1]+sum[i][k]);

*/#include

#include

#include

#include

#include

using namespace std;

const int maxn=102;

const int maxm=10002;

int n,m,x,t,l,r;

int dp[maxn][maxm],sum[maxn][maxm],sc[maxn][maxm],q[maxm];

int cost1(int i,int k,int j)

int cost2(int i,int k,int j)

int main()

}//for(i=1;i<=m;i++)sum[n+1][i]=sum[n][i];

for(i=x+1; i<=x+t; i++)

dp[1][i]=sum[1][i]-sum[1][x-1];

for(i=x-t; i<=x; i++)

dp[1][i]=sum[1][x]-sum[1][i-1];

for(i=2; i<=n; i++)

head=tail=0;

for(j=m; j>=1; j--)

int tmp=cost2(i,r,j);

while(tail>head&&cost2(i,q[tail-1],j)j+t) head++;

}while(q[head]-t>j) head++;

if(tail>head) dp[i][j]=max(dp[i][j],cost2(i,q[head],j));}}

int ans=0;

for(i=1; i<=m; i++)

cout<}return 0;

}

hdu4374(單調佇列優化dp)

這題的轉移很明顯。用dp i j 表示到達i層j位置時的最大得分 sum i j 表示第i層前j個數的和 dp i j max max dp i 1 j k sum i 1 j k 1 sum i 1 j 1 score i j max dp i 1 j k sum i 1 j k sum i 1 ...

hdu4374 單調佇列優化dp

題意就不多說了,直接說思路吧 對每一層的點都有兩種方式到達 左邊不超過t步 或右邊不超過t步 對這兩種方式容易得出 dp i j max dp i j dp i 1 k sum i j sum i k 1 從上層的k向右走過來 dp i j max dp i j dp i 1 k sum i k s...

hdu 3530 dp 單調佇列優化

題目 題意 給你乙個長度為n的數列,要求乙個子區間,使得區間的最大值與最小值的差s滿足,m s k,求滿足條件的最長子區間 分析 做了前面幾題後,這題容易想到用兩個單調佇列維護當前最值,作為判斷條件,如果差值大於k了,就去掉較前面的那個佇列元素,並把區間頭更新為它的標號 1,這裡注意差值小於m並不需...