B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int a[100000];
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int b[100000];
for (int i = 1; i <= n; i++)
{
b[i] = 1;
}
int temp = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i - 1; j++)
{
if (a[i] > a[j])
{
b[i] =max(b[i], b[j] + 1);
}
}
}
sort(b + 1, b + n + 1);
cout << b[n];
}
2.思路
dp
P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.代码
#include<iostream>
using namespace std;
int main()
{
int n, m=0;
cin >> n;
int a[200010], b[200010];
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
b[1] = a[1]; m = b[1];
for (int i = 1; i <= n; i++)
{
b[i] = max(a[i], a[i] + b[i - 1]);
m = max(m, b[i]);
}
cout << m;
}
2.思路
dp
P8707 [蓝桥杯 2020 省 AB1] 走方格 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.
#include<iostream>
using namespace std;
int main()
{
int n, m, f[100][100];
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
f[i][1] = 1;
}
for (int i = 1; i <= m; i++)
{
f[1][i] = 1;
}
for (int i = 2; i <= n; i++)
{
for (int j = 2; j <= m; j++)
{
if (i % 2 == 0 && j % 2 == 0)
{
f[i][j] = 0;
}
else
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
cout << f[n][m];
}
2.思路
dp
P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)1.代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[1010][1010], b[1010][1010];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
cin >> a[i][j];
}
}
for (int i = 1; i <= n; i++)
{
b[n][i] = a[n][i];
}
for (int i = n - 1; i > 0; i--)
{
for (int j = 1; j <= i; j++)
{
b[i][j] = a[i][j] + max(b[i + 1][j], b[i + 1][j + 1]);
}
}
cout << b[1][1];
}
2.思路
dp
P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[100000], x, num = 0;
while (cin >> x)
{
a[++num] = x;
}
int b[100000];
for (int i = 1; i <= num; i++)
{
b[i] = 1;
}
for (int i = 1; i <= num; i++)
{
for (int j = 1; j <= i - 1; j++)
{
if (a[i]<=a[j])
{
b[i] = max(b[i], b[j] + 1);
}
}
}
sort(b + 1, b + num + 1);
cout << b[num] << endl;;
for (int i = 1; i <= num; i++)
{
b[i] = 1;
}
for (int i = 1; i <= num; i++)
{
for (int j = 1; j <= i - 1; j++)
{
if (a[i] > a[j])
{
b[i] = max(b[i], b[j] + 1);
}
}
}
sort(b + 1, b + num + 1);
cout << b[num];
}
2.思路
是dp,但只能通过一半......