您的位置:首页 > Web前端

UVA 11552 四 Fewest Flops

2015-08-30 20:34 435 查看
Fewest Flops
Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %llu

Submit Status Practice UVA 11552

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int T;
int k,numk;
int i,j;
char a[1005];
int num[1005],q[1005][30],dp[1005][30];
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
memset(q,0,sizeof(q));
memset(dp,0,sizeof(dp));
scanf("%d",&k);
scanf("%s",a);
int l=strlen(a);
numk=l/k;
if(l%k!=0)
numk++;
for(i=1;i<=numk;i++)
{
for(j=(i-1)*k;j<=i*k-1 && j<l;j++)
{
int o=a[j]-'a'+1;
if(q[i][o]==0)
{
num[i]++;
q[i][o]=1;
}
}
}

for(i=1;i<=26;i++)
{
if(q[1][i]==1)
dp[1][i]=num[1];
}

for(i=2;i<=numk;i++)
{
for(j=1;j<=26;j++)
{
if(q[i][j]==1)
{
if(q[i-1][j]==1)
{
dp[i][j]=dp[i-1][j]+num[i];
if(num[i-1]==1)
dp[i][j]--;
else
{
for(int u=1;u<=26;u++)
{
if(u!=j && q[i-1][u]==1)
dp[i][j]=min(dp[i][j],dp[i-1][u]+num[i]-1);
}
}
}
else
{
dp[i][j]=9999;
for(int u=1;u<=26;u++)
{
if(q[i-1][u]==1)
dp[i][j]=min(dp[i][j],dp[i-1][u]+num[i]);
}
}
}
}
}

int ans=9999;
for(int i=1;i<=26;i++)
{
if(q[numk][i]==1 && dp[numk][i]<ans)
ans=dp[numk][i];
}

printf("%d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: