关于动态规划(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;
}
posted @   十萧  阅读(16)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示