c_cpp UVa 11552 - 最少的人字拖
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp UVa 11552 - 最少的人字拖相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e3+5;
const int MAXM=1e5+5;
const int mod=1e9+7;
int n,m,cnt[MAXN][30],f[MAXN][30],g[MAXN][30];
char x[MAXN];
int main(){
int aa; scanf("%d",&aa);
while(aa--){
scanf("%d",&m);
scanf(" %s",x+1); n=strlen(x+1);
memset(cnt,0,sizeof(cnt));
int num=0;
for(int j=1;j<=m;j++) cnt[1][x[j]-'a']++;
for(int j=0;j<26;j++) num+=(cnt[1][j]!=0);
for(int j=0;j<26;j++) if (cnt[1][j]!=0) f[1][j]=g[1][j]=num;
for(int i=m+1;i<=n;i+=m){
int tag=(i+m-1)/m; num=0;
for(int j=1;j<=m;j++) cnt[tag][x[i+j-1]-'a']++;
for(int j=0;j<26;j++) num+=(cnt[tag][j]!=0);
for(int j=0;j<26;j++) f[tag][j]=g[tag][j]=10000000;
for(int j=0;j<26;j++){
if (cnt[tag][j]==0) continue;
for(int k=0;k<26;k++){
if (cnt[tag-1][k]==0) continue;
f[tag][j]=min(f[tag][j],g[tag-1][k]+num-(j==k));
}
for(int k=0;k<26;k++){
if (cnt[tag][k]==0) continue;
if ((k!=j) || (k==j && cnt[tag][k]==m)) g[tag][k]=min(g[tag][k],f[tag][j]);
}
}
}
int ans=10000000;
for(int i=0;i<26;i++)
if (cnt[n/m][i]!=0) ans=min(ans,f[n/m][i]);
printf("%d\n",ans);
}
return 0;
}
以上是关于c_cpp UVa 11552 - 最少的人字拖的主要内容,如果未能解决你的问题,请参考以下文章
UVA11552 Fewest Flops
UVA - 11552 DP 划分
UVA - 11552 Fewest Flops
UVA - 11552 Fewest Flops
UVA 11552Fewest Flops
UVa 11552 最小的块数(序列划分模型:状态设计)