C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

NYOJ 336 子序列 解题报告

Posted on 2011-11-29 14:16 C小加 阅读(1410) 评论(1)  编辑 收藏 引用 所属分类: 解题报告
原题地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=336
简单DP。月赛的时候没去开这道题,本想把简单题先搞定的,不过悲剧了。
我刚开始很快想出了一种结构,但超内存了,然后试着加上滚动数组,发现不能用,只能换思路。
后来想的思路有点复杂,有好多情况没有考虑到,绕了好多弯路才AC。
状态转移方程式:f[j+1]=(f[j]+f[j+1])%10003;j+1为B串中第j个点。
第j个点的组数=前一个元素中第j个点的组数+前一个元素中的第j-1个点的元素的组数。
在遍历A串的过程中更新f[j+1]。
注意f[0]初始化为1,其他为0。
后来我用map 优化了一下,速度反而降低了。

 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=100003;
char A[MAXN];
char B[1003];
int f[1003];
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        //memset(f,0,sizeof(f));
        scanf("%s %s",A,B);
        int numa=strlen(A);
        int numb=strlen(B);
        if(numa<numb)
        {
            printf("0\n");
            continue;
        }
        else if(numa==numb)
        {
            if(!strcmp(A,B))
            {
                printf("1\n");
                continue;
            }
            else printf("0\n");
        }
        else
        {
            memset(f,0,sizeof(f));
            f[0]=1;
            for(int i=0;i<numa;i++)
            {
                for(int j=numb-1;j>=0;j--)
                {
                    if(j>i) continue;
                    //if(numa-i<=numb-j) continue;
                    if(A[i]==B[j])
                    {
                        f[j+1]=(f[j]+f[j+1])%10003;
                    }
                }
            }


            printf("%d\n",f[numb]);

        }
    }

    return 0;
}
        

Feedback

# re: NYOJ 336 子序列 解题报告  回复  更多评论   

2011-11-29 19:20 by alafeizai
这个解决的真漂亮。

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