hdu4374 單調佇列優化dp

2022-09-23 13:33:10 字數 976 閱讀 3974

題意就不多說了,直接說思路吧;

對每一層的點都有兩種方式到達(左邊不超過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] - sum[i][j - 1] ) ; //從上層的k點向左走來

因為每一層的sum是定的 所以 只要求滿足條件的dp【i-1】【k】-sum[i][k-1]的最大值就行 這就用到單調佇列來優化了

#include

#include

#includeusing namespacestd;#define inf -0x3f3f3f3fintsum[20100],num[110][20100],id[20100],dp[110][20100],map[10010];

intmax(inta,intb)

int main()

dp[1][x]=num[1][x];

for(i=x-1;i>=1&&x-i<=t;i--)dp[1][i]=dp[1][i+1]+num[1][i];

for(i=x+1;i<=m&&i-x<=t;i++)dp[1][i]=dp[1][i-1]+num[1][i];

intfront,top;sum[0]=0;

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

front=0,top=0;sum[m+1]=0;

for(j=m;j>=1;j--)sum[j]=sum[j+1]+num[i][j];

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

}intmax=inf;

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

if(dp[n][i]>max)max=dp[n][i];printf("%d\n",max);

}return0;

}

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 ...

hdu 4374 dp 單調佇列優化

解法 dp 單調佇列!有乙個的樓房,從第一層某個位置出發上樓,每次能爬上一層樓也可以在同一層左右移動,但是在每一層的移動距離不能超過某個值。現在每個位置都有乙個數值,求從第一層出發到最後一層經過的路徑上最多能取到的最大價值。dp i j 表示 第i行,第j個數字的最大價值!sum i j 表示 第i...

hdu 3530 dp 單調佇列優化

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