/*
解法: 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並不需...