ZOJ 2202 α編碼

來源:互聯網
上載者:User

///////////////////////////////////////////////////
// 1677474 2008-10-25 14:46:52 Accepted  2202 C++ 0 192 VRS
//計算編碼後再解碼的種數
//利用分治法,把字串s二分為s1和s2,再把兩部分的種數相乘
//注意情況:合并s1和s2時,考慮相鄰接的兩數可以組成一個編碼,還有對0的多種情況的討論
#include<iostream>
#include<string>
using namespace std;
char s[10000];

 

 

bool conbine(char s[],int l,int r)        //判斷兩數是否可以編碼,可以返回1,否則返回0
{
    if(s[l]>'2' || s[l]=='0') return 0;
    if(s[l]=='2' && s[r]>'6') return 0;
    return 1;
}

 

long Acode(char s[],int l,int r)      //二分遞迴計算種數
{
    long mid,ansl,ansr,ans;
    if(l==r) return 1;               //1個數時返回1
    if(l+1==r)                       //2個數的情況
        if(s[r]=='0')                //當第二個數是0時,只有一種編碼
            return 1;
        else
            return conbine(s,l,r)+1;
    if(l+2==r)                        //3個數的情況
        if(s[l+1]=='0' || s[r]=='0')  // 當第二或第三個數是0時,只有一種編碼
            return 1;
        else
            return conbine(s,l,l+1)+conbine(s,l+1,r)+1;
    mid=(r-l+1)/2-1+l;                   //l與r的中值
    if(s[mid+1]=='0')                 //當s2的首元素是0,如“1101”,不用計算s[mid]和s[mid+1]分開
    {                                 //的兩部分種數
        ansl=Acode(s,l,mid-1);
        ansr=Acode(s,mid+2,r);
        return ansl*ansr;
    }
    ansl=Acode(s,l,mid);
    ansr=Acode(s,mid+1,r);
    ans=ansl*ansr;
    if(s[mid+2]=='0')  return ans;   //當出現如“1011011”的情況時,由於s2的首元素"1"要和其後的
                                     //"0"組成一個編碼,所以不須考慮s[mid]和s[mid+1]組成一編碼的情況
    if(conbine(s,mid,mid+1))        
    {
        ansl=Acode(s,l,mid-1);
        ansr=Acode(s,mid+2,r);
        return ans+ansl*ansr;
    }
    else return ans;
}

 

 

int main()
{
    int len;
    while(cin>>s && s[0]!='0')
    {
        len=strlen(s);
        cout<<Acode(s,0,len-1)<<endl;
    }
    return 0;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.