• ZOJ 3182 HDU 2842递推


    ZOJ 3182 Nine Interlinks

      题目大意:把一些带标号的环套到棍子上,标号为1的可以所以操作,标号i的根子在棍子上时,只有它标号比它小的换都不在棍子上,才能把标号为i+1的环,放在棍子上或者取下,问n个环全部放在棍子上需要的最少步骤?

      一个简单的递推题,可是我硬生生想复杂了还把队友带偏了,真是惭愧,还好源源的一发强大的思路,简简单单就过了,源源太强了,tql,orz。我们以4个环全放上棍子为例,我们要先把第3个环放上,然后又把前两个环都取下,然后才能放上第4个环,再又把前两个环都上。听起来有点复杂,我们想一下如果4个都已全放上,要把他们取下呢,那就是先把前两个取下,然后才能取下第4个环,然后再把前2个放上,最后把前3个全取下,虽然中间细节可能不同,但全放上和全取下的操作步骤是一样的。我之前就陷入了,觉得放第i个时,前i-1个环不一定都要存在,然后推来推去把自己推晕了,其实要把i-2个取下,第i-3个就得在,最终就是全在。递推式就是ans[i]=ans[i-1]*2ans[i-2]+1,ans[i]就是前i个环全放上,或者全取下的步骤。

    #include<cstdio>
    int ans[30];
    int main()
    {
        ans[0]=0,ans[1]=1;
        for(int i=1;i<=30;i++)
            ans[i]=ans[i-1]+2*ans[i-2]+1;
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            printf("%d
    ",ans[n]);
        }
        return 0;
    }
    推推推

    HDU - 2842 Chinese Rings

      题意一模一样,不同的是这题的数据量大,得把递推式用矩阵快速幂实现。

    #include<cstdio>
    #include<cstring>
    #define ll long long
    const ll mod=200907;
    struct Node{
        int r,c;
        ll a[5][5];
        Node(){
            memset(a,0,sizeof(a));
        }
    }A,T;
    void init()
    {
        A.r=3,A.c=1;
        memset(A.a,0,sizeof(A.a));
        A.a[0][0]=1;A.a[1][0]=0;A.a[2][0]=1;
        T.r=3,T.c=3;
        memset(T.a,0,sizeof(T.a));
        T.a[0][0]=1,T.a[0][1]=2,T.a[0][2]=1;
        T.a[1][0]=T.a[2][2]=1;
    }
    Node mul(Node n1,Node n2)
    {
        Node ans;
        ans.r=n1.r,ans.c=n2.c;
        for(int i=0;i<n1.r;i++)
            for(int j=0;j<n2.c;j++)
                for(int k=0;k<n1.c;k++)
                    ans.a[i][j]=(ans.a[i][j]+(n1.a[i][k]*n2.a[k][j])%mod)%mod;
        return ans;
    }
    Node pow(Node n,int b)
    {
        Node ans;
        ans.r=n.r,ans.c=n.c;
        for(int i=0;i<3;i++)
            ans.a[i][i]=1;
        while(b)
        {
            if(b&1)
                ans=mul(ans,n);
            n=mul(n,n);
            b>>=1;
        }
        return ans;
    }
    int main()
    {
        int x;
        while(scanf("%d",&x)&&x)
        {
            init();
            T=pow(T,x-1);
            A=mul(T,A);
            printf("%lld
    ",A.a[0][0]);
        }
        return 0;
    } 
    再推再推

      反思一下自己的状态,不能老熬夜了,身体是革命的本钱(主要是掉头发掉头发,我不想去主持非常勿扰)

      最后夸一波源源,临危不乱,机智出题,(还有昭哥的nb面积对称法求和,不过臭男人不需要夸)。

  • 相关阅读:
    js高级-闭包
    js作用域
    js执行上下文与执行上下文栈
    js原型及原型链
    去除数组中重复的元素值
    树[省选联考2020]
    GDOI2020 游记
    Problem b[HAOI2011]
    分零食[JSOI2012]
    移动金币「SDOI2019」
  • 原文地址:https://www.cnblogs.com/LMCC1108/p/10569152.html
Copyright © 2020-2023  润新知