題意就不多說了,直接說思路吧;
對每一層的點都有兩種方式到達(左邊不超過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並不需...