bzoj 1049 數字序列 dp

2022-02-27 11:43:35 字數 1271 閱讀 2938

給定乙個長度為n的整數序列.在改變的數最小的和改變的幅度最小的前提下把它變成乙個單調嚴格上公升的序列.求改變的最小的數和這個幅度。

(貌似以前考試考過這道題)

其實這道題就是兩道題拼一塊的

我們首先考慮第一問

這是乙個經典模型,我們有

當有\(i - j \leq a_i - a_j\)

\(a_i\)和\(a_j\)不用更改\((i > j)\)

所以我們變號得到\(a_j - j \leq a_i - i\)

所以我們將所有序列中的值減去下標再做一遍最長不下降子串行即可

然後我們使用減去了下標的那個陣列作為第二問的初始陣列

我們設\(f[i]\)為第一問的lcis的dp陣列,\(g[i]\)表示第二問的dp陣列

(均表示1~i的答案)

我們有\(g[i] = min\text(f[i] == f[j] + 1)\)

由...ydc的題解我們知道...

現在乙個結論是,calc(j,i)的方案,一定會以某個k 為分界使得[j,k] 均為\(b_j\) 且\([k+1,i]\) 均為\(a_i\)

證明已跪...

所以我們利用這個性質統計答案即可

(很抱歉我連怎麼用都不會,%了一發hzwer的**)

#include #include #include using namespace std;

typedef long long ll;

inline void read(ll &x)

inline ll cat_max(const ll &a,const ll &b)

inline ll cat_min(const ll &a,const ll &b)return ret;

}ll suma[maxn],sumb[maxn];

int main()

for(ll i = n;i>=0;--i) add(f[i],i),g[i] = 1ll<<60;

a[0] = -inf1;g[0] = 0;

#define v g[p].to

for(ll u = 1;u<=n;++u)

for(ll i=v;i<=u;++i)

} }#undef v

printf("%lld\n%lld\n",n-f[n],g[n]);

getchar();getchar();

return 0;

}

BZOJ1049 數字序列 DP

time limit 10 sec memory limit 162 mb submit 1732 solved 745 submit status discuss 現在我們有乙個長度為n的整數序列a。但是它太不好看了,於是我們希望把它變成乙個單調嚴格上公升的序列。但是不希望改變過多的數,也不希望改...

bzoj 1049 數字序列

首先將最長上公升子串行轉化為不下降,做出第一問。由於是隨機資料,感覺可以轉移到每個數的數個數不會太多,所以暴力就行了 然後有乙個性質,如果從j轉移到i的話,那麼中間一定有乙個k k j k 開始wa了好幾發,問題分別是 1 dp i 維護的是所有數都變成小於等於i的值的答案,而最優解不一定是這樣。用...

bzoj1049 HAOI2006 數字序列

設f i 為以i開頭的最長上公升序列的長度,第乙個元素a i 必須滿足f i m,第x個元素為a y 則第 x 1 個元素a z 需要滿足的條件是a z a y 且f z f y 1 這位的題解很詳細 const int n 35010 struct edge edge int to,edge ne...