動的プログラミング
コースの考え方を考える:
lcs問題の最適化:
1.次のようにスペースの複雑さをOnに圧縮します。
#include<iostream>
#include<cstdio>
using namespace std;
int a[100005];
int b[100005];
int dp[2][100005];
int read()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
int main()
{
//freopen("in.txt","r",stdin);
int n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
for(int i=1;i<=n;i++)
{
b[i]=read();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j])
{
dp[i&1][j]=dp[(i-1)&1][j-1]+1;//奇偶优化,对于dp数组而言,其第一维存储的i可以压缩至i&1(奇偶)的种类数(2),而不影响结果
}
else
{
dp[i&1][j]=max(dp[(i-1)&1][j],dp[i&1][j-1]);
}
}
}
printf("%d",dp[n&1][n]);
return 0;
}
2.保存パス
パスをmin(n、m)スペースに保存します
編集距離の問題
AとBを2つの文字列とします。最小限の文字操作で文字列Aを文字列Bに変換します。ここで説明する文字操作には、(1)文字の削除、(2)文字の挿入、(3)文字の別の文字への変更が含まれます。文字列Aを文字列Bに変換するために使用される最小の文字オペランドは、文字列AからBへの編集距離と呼ばれ、d(A、B)と表示されます。与えられた文字列Aと文字列Bについて、編集距離d(A、B)を計算します。