51nod 1294 修改陣列 dp

2021-08-06 04:14:36 字數 553 閱讀 6269

給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?

n<=100000,0<=a[i]<=10^9

我們可以注意到a[i]最小的值是i,我們設b[i]=a[i]-i,那麼如果b[i]<0則位置i一定要修改。對於其餘的位置,我們就對b求一次最長不下降序列,那麼這些數就是可以保留的,其餘則要修改。至於正確性的話,感受一下即可。

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=100005;

int n,a[n],f[n],g[n],vis[n];

int main()

int mx=0;

for (int i=1;i<=n;i++)

printf("%d",n-mx);

return

0;}

51Nod 1294 修改陣列

acm模版 向大牛致敬 xdlove,思量許久,不能參透,大牛題解一語驚醒夢中人 首先可以明確一點,乙個最小的嚴格遞增的正整數子串行為1,2,3,n,那麼對於題目給出的任何乙個序列,需要最少改變多少個使得序列變為嚴格遞增的子串行呢?對於每乙個數a i 把a i 變為 a i i,如果此時a i 小於...

51Nod 1294修改陣列

給出乙個整數陣列a,你可以將任何乙個數修改為任意乙個正整數,最終使得整個陣列是嚴格遞增的且均為正整數。問最少需要修改幾個數?大佬題解 首先可以明確一點,乙個最小的嚴格遞增的正整數子串行為1,2,3,n,那麼對於題目給出的任何乙個序列,需要最少改變多少個使得序列變為嚴格遞增的子串行呢?對於每乙個數a ...

51nod1294 修改陣列

看題解的。就是將必須要修改的數去掉後求最長的不遞減子串行。upper bound lower bound要理解。有時候 1有時候不用是有原因的。include include include includeusing namespace std define rep i,s,t for int i ...