| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
(附代码 )谁来帮我 帮我 帮我 帮我 帮我!In Reply To:超时! 该怎么做 ? Posted by:nuciedh at 2007-07-23 19:59:03 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int w, l, d[301], m[301][301];
char p[301], s[601][27];
int match (int l, int r, int k)
{
int i, key, tmp;
if (l > r) return 0;
for (i = 0, key = 0; l + i <= r; i ++)
if (s[k][key] == p[l + i]) key ++;
if (key == strlen (s[k])) return key;
else return 0;
}
void print ()
{
for (int i = 0; i < l; i ++)
printf ("%d ", d[i]);
printf ("\n");
}
void solve ()
{
int i, j, k, mat, tmp;
scanf ("%s", p);
for (i = 0; i < w; i ++)
scanf ("%s", s[i]);
for (i = 0; i < l; i ++) d[i] = i + 1;
memset (m, 0, sizeof (m));
for (i = 0; i < l; i ++)
for (j = 0; j <= i; j ++)
{
for (k = 0; k < w; k ++)
{
if (s[k][0] == p[j])
{
int key = match (j, i, k);
if (key > m[j][i]) m[j][i] = key;
}
}
}
for (i = 0; i < l; i ++)
{
for (j = 0; j <= i; j ++)
{
mat = m[j][i];
if (j && mat)
{
mat = d[j - 1] + (i - j + 1 - mat);
if (d[i] > mat) d[i] = mat;
}
else
{
if (i + 1 - mat < d[i]) d[i] = i + 1 - mat;
}
}
}
printf ("%d\n", d[l - 1]);
}
int main ()
{
while (EOF != scanf ("%d %d", &w, &l))
solve ();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator