題目:
長度為n的序列a1, a2, ..., an,選出滿足 j < i 時, a[j] < a[i] 最長子序列
分析:當選擇第i個時候,在j狀態:dp[i]表示以i為終點的最大上公升序列
轉移方程:
dp[i] = max
}
**:
#include #include #include #include #include #include #include #include #include #include #include using namespace std;
int v[10000+10];
int dp[10000+10];
int main()
ans = 0;
memset(dp, 0, sizeof(dp));
for(i = 1; i<=n; i++)
ans = max(ans, dp[i]);
}printf("%d\n", ans);
}return 0;
}
二分優化:
如果子串行長度相同,則終點越小,則後面增長的潛能就越大
所以,將長度相同的位置設成其中最小值
狀態:dp[i]表示長度為i的序列中終點最小的值
轉移:因為dp[i]單調遞增,若a[j]>dp[i],則加入其後,若a[j]
優化**:
#include #include #include #include #include #include #include #include #include #include using namespace std;
#define inf 0x7f7f7f7f
#define max 1000+10
int a[max];
int dp[max];
int main()
for(i = 1; i<=n; i++)
printf("%d\n", lower_bound(dp, dp+n, inf) - dp);
} return 0;
}
ps(有序二分搜尋):
1、lower_bound(first, last, value);返回乙個
指標,指向ai>= value的第乙個元素。
2、upper_bound(first, last, value);返回乙個指標,指向ai> value的第乙個元素。
LIS 最長上公升子串行 dp 二分優化
建立乙個陣列res maxn res i 用來記錄以i位置為結尾的最長的子串行,那麼我們要求res這個陣列裡的最大值 注意不是res n 所以當我們在求res i 時,需要從0到i 1掃一遍,看看通過哪個點 鬆弛 因為這個演算法好像迪科斯徹最短路,所以借用這個名詞來解釋一下 這樣 如下 includ...
LIS 最長上公升序列(DP 二分優化)
求乙個數列的最長上公升序列 動態規劃法 o n 2 1 dp 2int lis int a,intn 3 16 17 18return cnt 1 因為初始化為0,所以返回結果 1 19 貪心 二分法 o nlogn 分析 要讓乙個序列具有最長上公升子串行,其實就是保證子串行中的每個元素盡可能小,降...
最長上公升子串行 II(LIS) 二分優化
題目鏈結 思路 這題說是dp,但是分析完之後更像貪心了,首先舉個例子比如乙個序列 3 1 2 1 8 5 6。後面下標從1開始計 那麼對於 a 1 a 1 a 1 和 a 2 a 2 a 2 來說,如果上公升子串行長度為2,那麼能接在 a 1 a 1 a 1 後面的也一定能接在 a 2 a 2 a ...