hdu 2476 구간 dp
dp[i][j] = min ( dp[i][j-1] + 1 , dp[i][k] + dp[k+1][j](b[j]==b[k] );
첫 번째 상황은 앞에 칠한 상태에서 j 브러시 문자를 직접 칠하는 거예요.
두 번째 상황은 j와 k의 문자가 같을 때 우리는 k에서 j를 한 번 닦을 수 있다. 그러면 소비는 k 이전의 한 번 닦는 대가와 k+1에서 j-1 사이의 한 번 닦는 대가의 합이다. 왜냐하면 j와 k는 동시에 닦이기 때문에 k는 앞의 구간에서 닦는 동시에 j를 닦고 그 다음에 닦는 부분의 합이다.
다음은 a열을 b열로 전환하는 과정입니다. 전환하는 과정은 현재 위치의 문자와 b열이 같으면 최소 비용이 변하지 않고 같지 않으면 앞의 어느 분부터 이런 색을 칠한 다음에 빈 열로 처리하면 됩니다. 매번 현재가 마지막 자리이기 때문에 마지막 자리까지 스캔할 때 무겁지 않고 빠뜨리지 않습니다.
코드는 다음과 같습니다.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 107
using namespace std;
int dp[MAX][MAX];
char a[MAX];
char b[MAX];
int ans[MAX];
int main ()
{
while ( ~scanf ( "%s" , a+1 ) )
{
scanf ( "%s" , b+1 );
int n = strlen ( a+1 );
memset ( dp , 0 , sizeof ( dp ) );
for ( int i = 1; i <= n ; i++ )
dp[i][i] = 1;
for ( int i = 1 ; i < n ; i++ )
for ( int j = 1 ; j <= n-i ; j++ )
{
dp[j][j+i] = dp[j][j+i-1] + 1;
for ( int k = j ; k < j+i ; k++ )
if ( b[j+i] == b[k] )
dp[j][j+i] = min ( dp[j][j+i] , dp[j][k] + dp[k+1][j+i-1] );
/*if ( a[k] == b[k] )
{
int temp = 0;
if ( k-1>=j ) temp += dp[j][k-1];
if ( k+1<=i+j ) temp += dp[k+1][i+j];
// if (j == 0 && i+j == n-1 ) cout << "No : " << temp << endl;
dp[j][j+i] = min ( dp[j][j+i] , temp );
}*/
}
for ( int i = 1 ; i <= n ; i++ )
ans[i] = dp[1][i];
for ( int i = 1 ; i <= n ; i++ )
{
if ( a[i] == b[i] )
ans[i] = ans[i-1];
else
for ( int j = 1 ; j < i ; j++ )
ans[i] = min ( ans[i] , ans[j] + dp[j+1][i] );
}
printf ( "%d
" , ans[n] );
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.