关于动态规划(Dynamic Programming)的若干思考 ------ [2.线性dp]
线性dp的两个经典题目:
1.最长上升子序列(LIS)
难的是输出路径(递归输出即可)
领域展开
#include <bits/stdc++.h>
using namespace std;
const int maxn =2024;
int cnt=0,ans=1;
int f[maxn],a[maxn],c[maxn];
void out(int x)
{
if(x==0) return ;
out(c[x]);
cout << a[x] <<' ';
}
int main()
{
int x=0,y=0;
while(scanf("%d",&x)!=EOF) a[++cnt] = x;
for(int i=1;i<=cnt;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]>a[j] && f[i]<f[j]+1)
{
f[i]=f[j]+1;
c[i]=j;
}
if(ans<f[i])
{
ans=f[i];
y=i;
}
}
}
cout << ans <<endl;
out(y);
return 0;
}
2.最长公共子序列(LCS)
转移方程:f[i,j]=max(f[i-1,j],f[i,j-1],f[i-1,j-1]+1)
领域展开
#include<bits/stdc++.h>
using namespace std;
const int maxn=2024;
int f[maxn][maxn];
char a[maxn],b[maxn];
int main()
{
int ans=0;
cin >> a >> b;
for(int i=1;i<=strlen(a);i++)
{
for(int j=1;j<=strlen(b);j++)
{
if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=0;
ans=max(ans,f[i][j]);
}
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)