• 2008-06-07

    百度之星DayI我AC的两个程序 - [As a ACMer]

    嗯...貌似zzn说的方法第4题可以AC了都……我的还错了5个点 由此就不说了

    第三题那个程已经贴出来了 呵呵 感兴趣的去翻翻看咯 貌似可以AC

     

    感到惊奇的是 竟然有好多人想看1、2题的程序……

    贴上来咯 给大家评论一番

    /*
     * =====================================================================================
     *
     *       Filename:  astar1.cpp
     *
     *    Description:  广告区间排名
     *
     *        Version:  1.0
     *        Created:  2008/5/31 19:34:54
     *       Revision:  none
     *       Compiler:  gcc
     *
     *         Author:  Coldwings Alpc42 (D.R.), dodele@gmail.com
     *        Company:  NUDT
     *
     * =====================================================================================
     */

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>

    int a[100001],n,ts;

    int main() {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&ts);
        a[n]=0;
        int i=0,j=-1,s=0,ans=-1;
        while(j<n) {
            s+=a[++j];
            while(s<ts && j<n) s+=a[++j];
            while(s-a[i]>=ts && i<j) s-=a[i++];
            if (s>=ts && (j-i<ans || ans==-1))
                ans=j-i;
        }
        printf("%d\n",ans);
        return 0;
    }

     

     

    /*
     * =====================================================================================
     *
     *       Filename:  astar2.cpp
     *
     *    Description:  LZW网页判重
     *
     *        Version:  1.0
     *        Created:  2008/5/31 19:50:48
     *       Revision:  none
     *       Compiler:  gcc
     *
     *         Author:  Coldwings Alpc42 (D.R.), dodele@gmail.com
     *        Company:  NUDT
     *
     * =====================================================================================
     */

    #include<string>

    using namespace std;

    bool inset(char x) {
        return ('0'<=x && x<='9' || 'a'<=x && x<='z' || 'A'<=x && x<='Z');
    }

    int trans(char* st,string* a) {
        if (*st) {
            if (*st<0) {
                *a=(*(st++));
                *a+=(*(st++));
                return trans(st,a+1)+1;
            } else {
                *a=*(st++);
                if (inset((*a)[0])) {
                    while(inset(*st)) {
                        *a+=*(st++);
                    }
                }
                return trans(st,a+1)+1;
            }
        } else {
            return 0;
        }
    }

    string a[256],b[256];
    int la,lb;

    void init() {
        char ta[256],tb[256];
        scanf("%s",ta);
        scanf("%s",tb);
        la=trans(ta,a+1);
        lb=trans(tb,b+1);
        a[0]="";
        b[0]="";
    }

    inline int min(int a,int b) { return a<b?a:b; }

    inline int max(int a,int b) { return a>b?a:b; }

    int d[256][256],f[256][256];

    int main() {
        init();
        memset(d,0,sizeof(d));
        for(int k=1;k<=min(la,lb);k++)
            for(int i=k;i<=la;i++)
                for(int j=k;j<=lb;j++)
                    if (a[i]==b[j])
                        d[i][j]=d[i-1][j-1]+1;
                    else
                        d[i][j]=0;
        memset(f,0,sizeof(f));
        for(int i=1;i<=la;i++)
            for(int j=1;j<=lb;j++) {
                f[i][j]=max(f[i-1][j],f[i][j-1]);
                for(int k=1;k<=d[i][j];k++)
                    if (f[i][j]<f[i-k][j-k]+k*k)
                        f[i][j]=f[i-k][j-k]+k*k;
            }
        printf("%d\n",f[la][lb]);
        return 0;
    }


    历史上的今天:


    随机文章:

    乱啊乱 2008-06-04

    收藏到:Del.icio.us




    评论

  • for(int k=1;k<=min(la,lb);k++)
    for(int i=k;i<=la;i++)
    for(int j=k;j<=lb;j++)
    if (a[i]==b[j])
    d[i][j]=d[i-1][j-1]+1;
    else
    d[i][j]=0;
    中第一行的循环 for(int k=1;k<=min(la,lb);k++) 没必要的吧?
    d[i][j] = d[i-1][j-1] + 1;中 始终都是d[i-1][j-1]先计算过了..k增加过程..貌似d[i][j]并没有改变?
    [我DP很差.. 没看懂这里.....]