B3637 最长上升子序列
思路:动态规划,dp
#include <bits/stdc++.h>
using namespace std;
int a[5000], ans[5000], n;
int main(){
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
ans[0] = 1;
for(int i = 1; i < n; i++){
int maxx = 0;
for(int j = 0; j < i; j++){
if(a[j] < a[i]) maxx = max(maxx, ans[j]);
}
ans[i] = maxx + 1;
}
sort(ans, ans + n);
cout << ans[n - 1];
return 0;
}
P1115 最大子段和
思路:动态规划,递推
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int*a=new int[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int*f=new int[n];
f[0]=a[0];
//动态规划实现
for(int i=1;i<n;i++)
{
if(f[i-1]+a[i]<=a[i])
{
f[i]=a[i];
}
else
{
f[i]=f[i-1]+a[i];
}
}
//求解最大值
int fmax=f[0];
for(int i=1;i<n;i++)
{
if(f[i]>fmax)
{
fmax=f[i];
}
}
cout<<fmax<<endl;
return 0;
}
P8707 [蓝桥杯 2020 省 AB1] 走方格
思路:动态规划,dp
#include<iostream>
using namespace std;
int main(){
int arr[31][31] = {0},i,j,n,m;
cin>>n>>m;
for(i = 1;i<=n;i++){
for(j = 1;j<=m;j++){
if(i == 1&&j == 1){
arr[i][j] = 1;
continue;
}
if(i%2 == 0&&j%2 == 0){
arr[i][j] = 0;
continue;
}
arr[i][j] = arr[i][j-1] + arr[i-1][j];
}
}
cout<<arr[n][m]<<endl;
return 0;
}
P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
思路:动态,递推
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N];
int dp[N][N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
}
}
//DP
for(int i=n;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
}
}
cout<<dp[1][1];
return 0;
}
P1020 [NOIP1999 普及组] 导弹拦截
思路:贪心,动态
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
const int INF = 0x7fffffff;
int n = 0, ma, d[N], a[N], k, x[N], xl = 1, t, len = 1;
int main(){
x[1] = INF;
while(cin>>a[++n]);
d[1] = a[1];
for (int i = 2;i <= n;i++){
if (a[i] <= d[len]) d[++len] = a[i];
else d[upper_bound(d + 1, d + len + 1, a[i], greater<int>()) - d] = a[i];
}
cout<<len - 1<<endl;
for (int i = 1;i <= n;i++){
t = 0;
if (x[xl] < a[i]){
xl++;
x[xl] = a[i];
}
else{
int k = lower_bound(x + 1,x + xl + 1,a[i]) - x;
x[k] = a[i];
}
}
cout<<xl<<endl;
return 0;
}