关于动态规划(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 @ 2024-02-17 16:23  十萧  阅读(23)  评论(2)    收藏  举报