POJ 1850 Code

来源:互联网 发布:手机能注册淘宝店铺吗 编辑:程序博客网 时间:2024/05/29 18:57

    下标都弄得我头晕。我先打表把以某字母开头长度为i的方案数都预先存储。然后再从输入的字符串里面分解:

假设为 cdvx字符串,把长度为1,2,3的所有方案数相加,然后从做到右来分析,第一个字符c,第一个字符最小必须为a,把a,b开头长度为4的方案数加起来;第二个字符最小必须为‘c’+1也就是d,所以这个不管;v这个位置必须大于'd',所以又把‘e’~‘u’开头长度为2的方案数加起来,最后一位一样的做法。

到这里应该知道解题的方法了,有人说这是杨辉三角,把打表的结果输出来一看真的是杨辉三角,但是做法是一样的。

代码:

#include<iostream>using namespace std;int dp[30][30],cnt[30]; //dp为以某字符开头长度为i的方案数,cnt为长度为i的所有方案数。int main(){    int i,j,k,sum,temp;    for( i=1;i<=26&&(dp[1][i]=1);i++);    cnt[1]=26;    for( i=2,sum=26;i<=26;i++){          temp=0;            for( j=1;j<=27-i;j++){              sum-=dp[i-1][j];              dp[i][j]=sum;              temp+=sum;         }         sum=temp;  cnt[i]=sum;    }        char str[15];        while( scanf("%s",str)!=EOF){           sum=0;           bool flag=true;           int len=strlen(str);           for( i=1;i<len;i++){                if( str[i]-str[i-1]<=0){ //判断有没有降序的情况                     flag=false; break;}                else sum+=cnt[i];           }             if( flag){                                     for( i=0;i<len;i++){   //按分析解题                j=( i==0? 1:str[i-1]-'a'+2 );                for( ;j<=str[i]-'a';j++)                     sum+=dp[len-i][j];           }           printf("%d\n",sum+1);           }           else            printf("0\n");    }           return 0;  }

修改一下,原来没想那么多现在有种更好的思路,补上去,没有前面那么复杂。很好理解,看代码就懂了。组合数学,选出来的字符自然会组成有序。

代码:

#include<iostream>using namespace std;const int M=27;int C[27][27];int main(){    int i,j;    memset(C,0,sizeof(C));    for(i=0;i<M;i++)     for(j=0;j<=i;j++)      if(i==0||j==0) C[i][j]=1;      else C[i][j]=C[i-1][j-1]+C[i-1][j];    int len,ans;    char start,ch,str[27];    bool flag;    while( scanf("%s",str)!=EOF){           len=strlen(str);           flag=true;           for(i=1;i<len&&flag;i++)             if(str[i-1]>str[i]){                flag=false;break;}                           if(!flag){printf("0\n");continue;}                      for( i=1,ans=1;i<len;i++)                 ans+=C[26][i];           for( i=0,start='a';i<len;i++){            for( ch=start;ch<str[i];ch++)                 ans+=C['z'-ch][len-i-1];            start=str[i]+1;           }               printf("%d\n",ans);    }          return 0;               }



 

原创粉丝点击