删除字串

题目描述:https://www.nowcoder.com/acm/contest/79/C

这道题用dp做的

#include<stdio.h>
int max(int a,int b)
{
 if(a>b)
 return a;
 else
 return b;
}
char s[100002];
int a[100002][12][2],b[100002];
int main()
{
 int i,j,n,m,t,k,ans=0,temp,p;
 scanf("%d%d",&n,&m);
 scanf("%s",s);
 if(s[0]=='a')
 a[0][0][0]=1;
 for(j=1;j<n;j++)
 {
  if(s[j]=='a')
  a[j][0][0]=a[j-1][0][0]+1;
  else
  a[j][0][0]=a[j-1][0][0];
 }
 for(i=0;i<n;i++)
 {
  if(s[i]=='a')
  {
   t=i;
   break;
  }
 }
 for(i=t+1;i<n;i++)
 {
  if(s[i]!=s[i-1])
  b[i]=b[i-1]+1;
  else
  b[i]=b[i-1];
 }
 for(i=1;i<=m;i++)
 {
  a[t][i][0]=a[t][0][0];
 }
 for(i=t+1;i<n;i++)
 {
  for(j=1;j<=m;j++)
  {
   k=b[i];
   p=s[i]-97;
   if(j<=k)
   {
    if(s[i]!=s[i-1])
    {
     a[i][j][p]=max(a[i-1][j][p]+1,a[i-1][j-1][p]+1);
     a[i][j][p]=max(a[i][j][p],a[i-1][j-1][p^1]+1);
     a[i][j][p^1]=max(a[i-1][j][p^1],a[i-1][j-1][p^1]);
    }
    else
    {
     a[i][j][p]=max(a[i-1][j-1][p]+1,a[i-1][j][p]+1);
     a[i][j][p]=max(a[i-1][j-1][p^1]+1,a[i][j][p]);
     a[i][j][p^1]=max(a[i-1][j-1][p^1],a[i-1][j][p^1]);
    }
   }
   else
   {
    a[i][j][p]=a[i][k][p];
    a[i][j][p^1]=a[i][k][p^1];
   }
  }
 }
    ans=max(a[n-1][m][0],a[n-1][m][1]);
 printf("%d",ans);
 return 0;
}

posted on 2018-03-25 11:33  laplus  阅读(180)  评论(0)    收藏  举报

导航