一:最长序列问题:
最长公共子序列:
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1]+1;
if(a[i]!=b[j])
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
最长上升子序列
for(i=0;i<n;i++)
for(j=0;j<i;j++)
if(a[i]>a[j] && dp[j]+1>dp[i])
//pre[i]=j
dp[i]=dp[j]+1;
最长公共上升子序列
hdu 1423
#include
#include
#include
int dp[505][505];
int a[505],b[505];
using namespace std;
int main()
{
int t,i,j,Max,len1,len2;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d",&len1);
for(i=1;i<=len1;i++)
scanf("%d",&a[i]);
scanf("%d",&len2);
for(j=1;j<=len2;j++)
scanf("%d",&b[j]);
for(i=1;i<=len1;i++)
{
Max=0;
for(j=1;j<=len2;j++)
{
dp[i][j]=dp[i-1][j];
if(a[i]>b[j] && Max<dp[i-1][j])
Max=dp[i-1][j];
if(a[i]==b[j])
dp[i][j]=Max+1;
}
}
int ans=0;
for(i=1;i<=len2;i++)
ans=max(ans,dp[len1][i]);
if(t)
printf("%d\n\n",ans);
else
printf("%d\n",ans);
}
return 0;
}
优化为1维空间:
for(i=1;i<=n1;i++)
{
max=0;
for(j=1;j<=n2;j++)
{
if (a[i]>b[j]&&max<f[j])
max=f[j];
if(a[i]==b[j])
f[j]=max+1;
}
}
max=0;
for(i=1;i<=n2;i++)
if(max<f[i])
max=f[i];
二:背包问题
三:整数划分
DP研究
最新推荐文章于 2024-06-28 15:11:28 发布