uva:111-History Grading
テーマリンク:http://uva.onlinejudge.org/index.php?option=com_オンラインjudge&Itemid=8&category=114&page=show_problem&problem=47
LCS問題:動き方程式:dp[i][j]=dp[i-1]、[j-1]+1(numx[i]=numy[j])𞓜max{dp[i-1]、[j],dp[i]、[i]、[j-1]]
この問題の意味に注意して、人をめぐって、データを見ている時に感じがおかしいです。それから、問題をよく見て、入力された一連の数字は、対応桁iの上の数a[i]が第iの出来事の発生時間を表しています。
コードは以下の通りです
LCS問題:動き方程式:dp[i][j]=dp[i-1]、[j-1]+1(numx[i]=numy[j])𞓜max{dp[i-1]、[j],dp[i]、[i]、[j-1]]
この問題の意味に注意して、人をめぐって、データを見ている時に感じがおかしいです。それから、問題をよく見て、入力された一連の数字は、対応桁iの上の数a[i]が第iの出来事の発生時間を表しています。
コードは以下の通りです
#include
#include
#include
using namespace std ;
const int maxn = 25 ;
int n;
int numx[maxn] ;
int numy[maxn] ;
int dp[maxn][maxn] ;
int main()
{
//freopen("data.in" , "r" , stdin) ;
int i ;
int j ;
int x ;
cin>>n;
for(i = 1 ; i <= n ; i ++)
{
cin>>x ;
numx[x] = i ;
}
while(cin>>x)
{
numy[x] = 1 ;
for(j = 2 ; j <= n ; j ++)
{
cin>>x ;
numy[x] = j ;
}
memset(dp , 0 , sizeof(dp)) ;
for(i = 1 ; i <= n ; i ++)
{
for(j = 1 ; j <= n ; j ++)
{
if(numx[i]==numy[j])
dp[i][j] = dp[i-1][j-1] + 1 ;
else
dp[i][j] = dp[i-1][j] > dp[i][j-1] ? dp[i-1][j] : dp[i][j-1] ;
}
}
printf("%d
" , dp[n][n]) ;
}
return 0 ;
}
私は先ほど記憶化検索の方式でこのテーマを提出しました。初期化の時は-1に初期化するべきです。でないと、エラーが発生します。コードは下記の通りです。#include
#include
#include
using namespace std ;
const int maxn = 1005 ;
char numa[maxn] ;
char numb[maxn] ;
int num[maxn][maxn] ;
int lena ;
int lenb ;
int dp(int , int ) ;
int main()
{
//freopen("data.in" , "r" , stdin) ;
while(1)
{
cin.getline(numa , sizeof(numa)) ;
if(!cin)
break ;
cin.getline(numb , sizeof(numb)) ;
lena = strlen(numa ) ;
lenb = strlen(numb ) ;
memset(num , -1 , sizeof(num)) ;
dp(lena - 1 , lenb - 1) ;
printf("%d
" , num[lena-1][lenb-1]) ;
}
return 0 ;
}
int dp(int n , int m)
{
int & ans = num[n][m] ;
if(n < 0 || m < 0)
return 0 ;
if(ans >= 0)
{
return ans ;
}
if(numa[n]==numb[m])
{
ans = dp(n - 1 , m - 1) + 1 ;
}
else if(dp(n-1 , m) >= dp(n , m - 1))
{
ans = dp(n-1 , m) ;
}
else ans = dp(n , m - 1) ;
return ans ;
}