统计单词个数

来源:互联网 发布:降调软件手机版 编辑:程序博客网 时间:2024/04/29 14:19

出处:NOIP2001TG2   提交:RQNOJ302,VIJOS1118

这题之前有个同学问过我,当时有点不太明白,直接飘过了。后来看了一下网上的思路,之后就落下了。

昨天刚好看到这个题,就按之前的思路写了一下,在VIJOS上交了,AC了。

后面又去RQN交,本以为肯定能过,只是时间不同而已,结果只给了40分。当时就想Vijos数据太水了,那里全是0ms,RQN上面最少27ms,也可能是我的方法没优化的原因。

今天下午把程序重新看了一下,改了个小错误,终于AC了。嘿嘿~~

 

 

#include<stdio.h>#include<string.h>#include<algorithm> #include<iostream>using namespace std;const int N=201;const int INF=0x3ffffff;int max(int a,int b){    return a>b?a:b;    }int min(int a,int b){    return a<b?a:b;    }int len[N],dp[50][N],d[N][N],wlen[10];char str[N],word[7][200];int main(){    int p,s,i,j,k,t,flag;    while(~scanf("%d %d",&p,&k))    {          str[0]=' ';           for (i=0;i<p;i++)          scanf("%s",str+1+20*i);          p*=20;          scanf("%d",&s);          for (i=1;i<=s;i++)          {              scanf("%s",word[i]);              wlen[i]=strlen(word[i]);              }          for (i=1;i<=p;i++) len[i]=INF;          for (i=1;i<=p;i++)          {              for (j=1;j<=s;j++)              {                  if (!strncmp(str+i,word[j],wlen[j]))                  {                     len[i]=min(wlen[j],len[i]);                                                 }              }              }          memset(d,0,sizeof(d));          for (i=1;i<=p;i++)          {              for (j=i;j<=p;j++)              {                  flag=0;                  for (t=j;t>=i;t--)                  {                      if (t+len[t]==j+1)                      {                         flag=1;                          break;                        }                  }                  d[i][j]=d[i][j-1]+flag;                  }              }          memset(dp,0,sizeof(dp));          for (j=1;j<=p;j++)          {              dp[1][j]=d[1][j];              }                    for (i=2;i<=k;i++)          {              for (j=i;j<=p;j++)              {                  flag=0;                  for (t=i-1;t<j;t++)                  {                      flag=max(dp[i-1][t]+d[t+1][j],flag);                      }                   dp[i][j]=flag;                 }              }          printf("%d\n",dp[k][p]);    }    return 0;   }


 

原创粉丝点击