poj 3267 简单dp

来源:互联网 发布:udid后台代理系统源码 编辑:程序博客网 时间:2024/05/18 12:41
/*每天一个dp题,坚持下去你就是高手*//*首先这道题是采用逐个匹配*//*转移方程 dp[t-1] = min(dp[i-1]+t-i-x,dp[t-1]); dp[i] = min(dp[i-1]+1,dp[i]); */#include <cstdio>#include <cstring>#include <iostream>using namespace std;char str[10000],dir[1000][100];int dp[10000];int main(){    int n,m;    while(cin>>n>>m)    {        memset(dp,0,sizeof(dp));        cin>>str+1;       for (int i=1;i<=n;i++)       {          cin>>dir[i];       }       dp[0] = 0;       for(int i=1;i<=m;i++)        dp[i] = dp[i-1] + 1;       for (int i=1;i<=m;i++)       {           for(int j=1;j<=n;j++)           {               if(str[i] == dir[j][0])               {                   int t = i ,x = 0;                   while(t<=m)                   {                       if(str[t++] == dir[j][x])                        x++;                       if(x == strlen(dir[j]))                       {                           dp[t-1] = min(dp[i-1]+t-i-x,dp[t-1]);                           break;                       }                   }               }           }           dp[i] = min(dp[i-1]+1,dp[i]);       }      // for(int i=1;i<=m;i++)       // cout<<dp[i]<<" ";       cout<<dp[m]<<endl;    }}

0 0
原创粉丝点击