【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
生活随笔
收集整理的這篇文章主要介紹了
【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
luogu 3287
金牌導航 數據結構優化DP-5
題目大意
有n個玉米,給出高度,你可以選擇一個區間,使這個區間的玉米高度+1,你可以進行k次這樣的操作,查詢你操作完后最長不下降子序列最大值
代碼
對于選擇區間[l,r],如果同時把[r+1,n]也選進去,因為是最長不下降子序列,所以讓后面更高滿足需求,所以我們把[r+1,n]也選進去,所以每次選擇區間都是[i,n]
設fi,jf_{i,j}fi,j?為前i個玉米總共選擇j次的最長不下降子序列,因為每次選擇區間都是[i,n],所以i被選擇了j次,那么有:
fi,j=max?k<i,c?j,ak+c?ai+j(fk,c+1)f_{i,j}=\max_{k<i, c\leqslant j,a_k+c\leqslant a_i+j}(f_{k,c}+1)fi,j?=k<i,c?j,ak?+c?ai?+jmax?(fk,c?+1)
對于c?j,ak+c?ai+jc\leqslant j,a_k+c\leqslant a_i+jc?j,ak?+c?ai?+j可以建一個二維樹狀數組維護,每次找滿足條件的
代碼
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define N 10010 using namespace std; int n, k, a[N], c[510][N]; void add(int x, int y, int z) {for (x++; x <= k + 1; x += x & -x)//因為有0,而樹狀數組計算不了0,所以要+1for (int jy = y; jy <= 5500; jy += jy & -jy) c[x][jy] = max(c[x][jy], z);return; } int ask(int x, int y) {int g = 0;for (x++; x; x -= x & -x)for (int jy = y; jy; jy -= jy & -jy) g = max(g, c[x][jy]);return g; } int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);for (int i = 1; i <= n; ++i)for (int j = k; j >= 0; --j)add(j, a[i] + j, ask(j, a[i] + j) + 1);printf("%d", ask(k, 5500));return 0; }總結
以上是生活随笔為你收集整理的【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021住宅插座分布图指引HJSJ
- 下一篇: 纪中A组模拟赛总结(2021.7.12)