點選開啟鏈結
思路:lis的變形,唯一不同的是條件a[i] - i > a[j] - j + 1,i>j。因為要確保這兩個元素之間能插入i - j + 1個元素
每個數先減去它的下標,防止下面的情況發生:加入序列是1,2,2,2,3,這樣求上公升子串行是3,也就是要修改2個,但是中間的兩個2,變化範圍又不能超過(1,3)
那麼這樣求的也就不對,但是減掉之後,相當於給中間重複的數留下了修改的空間解釋下為什麼可以減而保持正確性:因為題目所求時嚴格遞增,假設是2,3, 4,那麼變成1, 1, 1,所以在lis裡非嚴格遞增就可以了
這也是為什麼要在upper_bound的位置插入
另外:lower_bound返回第乙個》=key的位置;upper_bound返回第乙個》key的位置,這樣相減才是key的個數
求嚴格遞增的lis的方法(非嚴格遞增的lis只要把lower_bound改成upper_bound
)
1 memset(b,0x3f,sizeof(b));
2int mx = -1;3
for(int i=1; i<=n; i++)
**:
1 #include 2using
namespace
std;34
const
int maxn = 1e5+10;5
6int
n,a[maxn],b[maxn];78
//int dp()else
19//}20
//return len;
21//}22
23int
main()
3132 memset(b,0x3f,sizeof
(b));
33int mx = -1;34
for(int i=1; i<=n; i++)
3940
int ans = n-mx;
41 printf("
case #%d:\n%d\n
",cas,ans);
4243
//int ans = n-dp();
44//
printf("case #%d:\n%d\n",cas,ans);45}
46 }
HDU 5256 序列變換
題意 我們有乙個數列a1,a2.an,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。請輸出最少需要修改多少個元素。思想 第i個位置到第i k個位置可以使當中k 1個相等的數通過變換滿足題意,首先把i位置上的數減去i,消除位置的影響 1 2 4 ...
HDU 5256 序列變換 LIS變形
傳送們 5256 他讓求至少可以改變幾個數讓他們單調遞增 我們可以處理一下 讓每乙個數都減去i 這樣在後面求出的最長遞增子串行的每幾個數之間都有相應的空位使他變過來 然後求最長遞增子串行就可以啦 如 4 2 3 3 4 變為2 2 1 1 最長遞增子串行為2,2 或1 1 我們就可以變為2 3 4 ...
HDU 5256 序列變換 線性DP
我們有乙個數列a1,a2.an,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。請輸出最少需要修改多少個元素。input 第一行輸入乙個t 1 t 10 表示有多少組資料 每一組資料 第一行輸入乙個n 1 n 105 表示數列的長度 第二行輸入n...