第三章作业
1. 单调递增最长子序列
#include<iostream>
using namespace std;
int DL(int a[], int b[],int n) {
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++)
{
if (a[j] < a[i]&& b[j]>b[i] - 1) {
b[i] = b[j] + 1;
}
}
}
int t = b[1];
for (int k = 0; k < n; k++)
{
if (b[k] > t) {
t = b[k];
}
}
return t;
}
int main() {
int n;
cin >> n;
int *a = new int[n];
int *b = new int[n]();
for (int i = 0; i < n; i++) {
b[i]++;
}
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
cout << DL(a, b, n);
system("pause");
}
1.1 dp[i]=max{1, dp[j]+1 | j<I 且aj<ai}
1.2 填表维度为n*n, 填表范围为下三角,填表顺序从左到右,从上到下。
1.3 时间复杂度为O(n^2),空间复杂度为O(1)
2. 动态规划法基本思想与分治法一致,都是将问题分解为若干子问题,只是动态规划的子问题一般不是互相独立的。
3. 编程时交流较少,一般是敲完代码再交流思想。