比赛 |
2025暑期集训第6场 |
评测结果 |
AAAAAAAAAAAAAAAW |
题目名称 |
Moortal Cowmbat |
最终得分 |
94 |
用户昵称 |
李金泽 |
运行时间 |
1.576 s |
代码语言 |
C++ |
内存使用 |
30.56 MiB |
提交时间 |
2025-07-12 10:29:22 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#define N 100005
#define M 30
#define ri register int
using namespace std;
int n,m,K,a[N],f[N][M],g[N][M],d[M][M],s[M][N],ans=2147483647;
char c[N];
int min(int x,int y){return x<y?x:y;}
void init()
{
scanf("%d%d%d",&n,&m,&K);
scanf("%s",c+1);
for(ri i=1;i<=n;i++)a[i]=c[i]-96;
for(ri i=1;i<=m;i++)
for(ri j=1;j<=m;j++)
scanf("%d",d[i]+j);
for(ri k=1;k<=m;k++)
for(ri i=1;i<=m;i++)
for(ri j=1;j<=m;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(ri i=1;i<=m;i++)
for(ri j=1;j<=n;j++)
s[i][j]=s[i][j-1]+d[a[j]][i];
}
int main(){
freopen("cowmbat.in","r",stdin);freopen("cowmbat.out","w",stdout);
init();
memset(f,0x3f,sizeof(f));
memset(g,0x3f,sizeof(g));
for(ri i=K;i<min(n,2*K);i++)
for(ri j=1;j<=m;j++)
{
f[i][j]=s[j][i];
g[i][j]=min(f[i][j],g[i-1][j]+d[a[i]][j]);
for(ri k=1;k<=m;k++)
g[i][j]=min(g[i][j],f[i-1][k]+d[a[i]][j]);
}
for(ri i=2*K;i<=n;i++)
for(ri j=1;j<=m;j++)
{
f[i][j]=g[i-K][j]+s[j][i]-s[j][i-K];
for(ri k=1;k<=m;k++)
f[i][j]=min(f[i][j],f[i-K][k]+s[j][i]-s[j][i-K]);
g[i][j]=min(f[i][j],g[i-1][j]+d[a[i]][j]);
for(ri k=1;k<=m;k++)
g[i][j]=min(g[i][j],f[i-1][k]+d[a[i]][j]);
}
for(ri i=1;i<=m;i++)ans=min(ans,f[n][i]);
printf("%d",ans);
return 0;
}