标签:mic 最小 回文 getchar noip mem 区间 font div
最近除了模拟赛和往年noip题自我测试,就只能搞点弱项专题训练了。
都是洛谷上的题,每次从水题开始:
区间dp,对于一个字母,增删其实效果是相同的,取代价最小的即可。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=3000+10;
int n,m,val[maxn],dp[maxn][maxn];
char c,s[maxn];
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<‘0‘||cc>‘9‘) cc=getchar();
while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
return aa;
}
int main() {
m=read();n=read(); int x,y;
scanf("%s",s+1);
for(int i=1;i<=m;++i) {
do c=getchar();while(c<‘a‘||c>‘z‘);
x=c-‘a‘+1; y=min(read(),read());
val[x]=y;
}
memset(dp,0x3f3f3f3f,sizeof(dp));
for(int i=1;i<=n;++i) dp[i][i]=0;
for(int i=1;i<n;++i) if(s[i]==s[i+1]) dp[i][i+1]=0;
for(int l=1;l<n;++l) {
for(int i=1;i<=n-l;++i) {
int j=i+l;
if(s[i]==s[j]&&l>1) dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
dp[i][j]=min(dp[i][j],dp[i+1][j]+val[s[i]-‘a‘+1]);
dp[i][j]=min(dp[i][j],dp[i][j-1]+val[s[j]-‘a‘+1]);
}
}
printf("%d",dp[1][n]);
return 0;
}
标签:mic 最小 回文 getchar noip mem 区间 font div
原文地址:http://www.cnblogs.com/Serene-shixinyi/p/7755456.html