6.1 线性DP
具有线性“阶段”划分的动态规划算法被称为线性DP。常见的有最长上升子序列(LIS),最长公共子序列(LCS),数字三角形等。
相关练习:
1. Mr. Young's Picture Permutations(POJ2279)
#include<iostream>
using namespace std;
const int N = 3100;
int a[N], b[N];
int f[N][N];
int n;
int main(){
cin>>n;
for(int i = 1; i <= n ;++i) cin>>a[i];
for(int i = 1; i <= n; ++i )cin>>b[i];
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
int& x= f[i][j];
x = f[i-1][j];
if(a[i] == b[j]){
x = max(x, 1);
for(int k = 1; k < j; ++k){
if(b[k] < b[j]) x = max(x, f[i-1][k]+1);
}
}
}
}
int ans = 0;
for(int i = 1; i <= n; ++i)
ans = max(ans, f[n][i]);
cout<<ans<<endl;
return 0;
}
5.传纸条
#include<iostream>
using namespace std;
const int N = 60;
int f[N*2][N][N];
int arr[N][N];
int n, m;
int main(){
cin>>n>>m;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= m; ++j)
cin>>arr[i][j];
}
for(int i = 2; i <= n + m; ++i){
for(int l1 = 1; l1 <= n; ++l1){
for(int l2 = 1; l2 <= n; ++ l2){
int r1 = i - l1, r2 = i - l2;
if(r1 >= 0 && r1 <= m && r2 >= 0 && r2 <= m){
//ll
int & l = f[i][l1][l2];
l = f[i-1][l1-1][l2-1];
//lt
l = max(l, f[i-1][l1-1][l2]);
//tl
l = max(l, f[i-1][l1][l2-1]);
//tt
l = max(l, f[i-1][l1][l2]);
l += arr[l1][r1];
if(l1 != l2) l += arr[l2][r2];
}
}
}
}
cout<<f[n+m][n][n]<<endl;
return 0;
}
7.Cookies

浙公网安备 33010602011771号