第三章作业

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. 编程时交流较少,一般是敲完代码再交流思想。

posted @ 2020-11-01 09:44  林驰  阅读(77)  评论(0编辑  收藏  举报