ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

SGU_506 _DP(最长公共自序列变种)

http://acm.sgu.ru/problem.php?contest=0&problem=506

Summer Training #2 DIV1,被完虐!

题意读了两个多小时!!!!

题意不说了,
第一种做法:
#define maxn 100010
#define maxm 120
using namespace std;
char a[maxn],b[maxm];
int cnt[27],p[27][maxn],now[maxm];
int main()
{
    scanf(
"%s",a);
    scanf(
"%s",b);
    
int n=strlen(a);
    
int m=strlen(b);
    clr(cnt);
    
for (int i=0;i<n;i++)
    {
        
int tmp=a[i]-'a';
        p[tmp][cnt[tmp]
++]=i;
    }
    
long long ans=0;
    clr(now);
    
for (int i=0;i<n;i++)
    {
        
int last=i-1;
        
int begin;
        
bool flag=1;
        
for (int j=0;j<m;j++)
        {
            
int tmp=b[j]-'a';
            
while (now[j]<cnt[tmp] && p[tmp][now[j]]<=last)
                now[j]
++;
            
if (now[j]==cnt[tmp])
            {
                flag
=0;
                
break;
            }
            last
=p[tmp][now[j]];
            
if (j==0)
                begin
=last;
        }
        
if (!flag)
            
break;
        ans
+=(n-last)*(begin-i+1);
        i
=begin;
    }
    printf(
"%I64d\n",ans);
    
return 0;
}

很诡异的是后面这个DP做法,第一次提交的时候居然:
搞不清楚Global Error是什么错误,重新提交了一下代码,AC了:

#define maxn 100010
#define maxm 120
using namespace std;
char a[maxn],b[maxm];
int dp[maxn][maxm];
int main()
{
    scanf(
"%s%s",a,b);
    
int n=strlen(a);
    
int m=strlen(b);
    clr(dp);
    
for (int i=0;i<=n;i++)
        dp[i][
0]=1;
    
for (int i=1;i<=n;i++)
    {
        
for (int j=1;j<=m;j++)
        {
            
if (a[i-1]==b[j-1])
                dp[i][j]
+=dp[i-1][j-1];
            
else
                dp[i][j
-1]+=dp[i-1][j-1];
        }
    }
    
long long ans=0;
    
for (int i=m;i<=n;i++)
        ans
+=dp[i][m]*(n-i+1);
    printf(
"%I64d\n",ans);
    
return 0;
}

posted on 2012-08-01 19:39 wangs 阅读(186) 评论(0)  编辑 收藏 引用 所属分类: ACM-DP


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理