刷題——Cheapest Palindrome POJ - 3280
/*
給定一個串和改變串的代價(串可變長變短),問令給定串變成迴文串的最小代價
增加一個字符和減少一個字符各有代價,這時選取最少最小的作爲改變這個字符的代價(刪掉和增加都滿足變化)
dp[i][j]表示以i爲頭j爲尾的串,i<j,ij間的距離從1開始增加,不斷使得dp[i][j]中距離比i,j小的串是迴文串
dp[i][j]:
a[i]==a[j],dp[i][j]=dp[i+1][j-1]
a[i]!=a[j],dp[i][j]=min(dp[i][j],dp[i][j-1]+ad[a[j]-'a'],dp[i+1][j]+ad[a[i]-'a'])
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define INF 1e8
int n,m;
char a[2005];
int ad[30];
int dp[2005][2005];
int main(){
while(~scanf("%d %d",&n,&m)){
scanf("%s",a);
memset(dp,0,sizeof(dp));
memset(ad,0,sizeof(ad));
for(int i=0;i<n;i++){
char c[2];
int s,t;
scanf("%s",c);
scanf("%d %d",&s,&t);
ad[c[0]-'a']=min(s,t);
}
for(int k=1;k<m;k++){
for(int i=0,j=k;j<m;i++,j++){
dp[i][j]=INF;
if(a[i]==a[j]){
dp[i][j]=dp[i+1][j-1];
}
else{
dp[i][j]=min(dp[i][j],dp[i][j-1]+ad[a[j]-'a']);
dp[i][j]=min(dp[i][j],dp[i+1][j]+ad[a[i]-'a']);
}
}
}
printf("%d\n",dp[0][m-1]);
}
return 0;
}
給定一個串和改變串的代價(串可變長變短),問令給定串變成迴文串的最小代價
增加一個字符和減少一個字符各有代價,這時選取最少最小的作爲改變這個字符的代價(刪掉和增加都滿足變化)
dp[i][j]表示以i爲頭j爲尾的串,i<j,ij間的距離從1開始增加,不斷使得dp[i][j]中距離比i,j小的串是迴文串
dp[i][j]:
a[i]==a[j],dp[i][j]=dp[i+1][j-1]
a[i]!=a[j],dp[i][j]=min(dp[i][j],dp[i][j-1]+ad[a[j]-'a'],dp[i+1][j]+ad[a[i]-'a'])
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define INF 1e8
int n,m;
char a[2005];
int ad[30];
int dp[2005][2005];
int main(){
while(~scanf("%d %d",&n,&m)){
scanf("%s",a);
memset(dp,0,sizeof(dp));
memset(ad,0,sizeof(ad));
for(int i=0;i<n;i++){
char c[2];
int s,t;
scanf("%s",c);
scanf("%d %d",&s,&t);
ad[c[0]-'a']=min(s,t);
}
for(int k=1;k<m;k++){
for(int i=0,j=k;j<m;i++,j++){
dp[i][j]=INF;
if(a[i]==a[j]){
dp[i][j]=dp[i+1][j-1];
}
else{
dp[i][j]=min(dp[i][j],dp[i][j-1]+ad[a[j]-'a']);
dp[i][j]=min(dp[i][j],dp[i+1][j]+ad[a[i]-'a']);
}
}
}
printf("%d\n",dp[0][m-1]);
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.