poj 1850 poj 1496
2012-08-18 20:09
190 查看
一下分析转自 http://blog.csdn.net/lyy289065406/article/details/6648492
分析的很详细,值得好好看!!!
POJ1850
POJ 1496
分析的很详细,值得好好看!!!
POJ1850
#include<iostream> #include<string> using namespace std; int c[27][27]={0}; /*打表,利用杨辉三角计算每一个组合数nCm*/ void play_table(void) { for(int i=0;i<=26;i++) for(int j=0;j<=i;j++) if(!j || i==j) c[i][j]=1; else c[i][j]=c[i-1][j-1]+c[i-1][j]; c[0][0]=0; return; } int main(int i,int j) { play_table(); char str[11]; while(cin>>str) { int len=strlen(str); /*检查str是否符合升序排列*/ for(i=1;i<len;i++) if(str[i-1]>=str[i]) { cout<<0<<endl; //本题只要求输入一次就允许结束程序 return 0; //因此若使用循环输入,一旦str不符合字典要求(如aab,ba等)就要结束程序 } //这是与POJ1496的最隐蔽区别 int sum=0; //str的值,初始为0 /*计算长度比str小的字符串个数*/ for(i=1;i<len;i++) sum+=c[26][i]; //c[26][i]表示 长度为i的字符串的个数 /*计算长度等于len,但值比str小的字符串个数*/ for(i=0;i<len;i++) //i为str的指针,对每一个位置枚举 允许选择的字符ch { char ch= (!i)?'a':str[i-1]+1; //ch = str[i-1]+1 根据升序规则,当前位置的ch至少要比str前一位置的字符大1 while(ch<=str[i]-1) //ch<=str[i]-1 根据升序规则,当前位置的ch最多只能比 str这个位置实际上的字符 小1 { sum+=c['z'-ch][len-1-i]; //'z'-ch : 小于等于ch的字符不允许再被选择,所以当前能够选择的字符总数为'z'-ch ch++; //len-1-i : ch位置后面(不包括ch)剩下的位数,就是从'z'-ch选择len-1-i个字符 } } cout<<++sum<<endl; // 此前的操作都是寻找比str小的所有字符串的个数,并不包括str本身,因此这里要+1 } system("PAUSE"); return 0; }
POJ 1496
#include<iostream> #include<string> using namespace std; int c[27][27]={0}; /*打表,利用杨辉三角计算每一个组合数nCm*/ void play_table(void) { for(int i=0;i<=26;i++) for(int j=0;j<=i;j++) if(!j || i==j) c[i][j]=1; else c[i][j]=c[i-1][j-1]+c[i-1][j]; c[0][0]=0; return; } int main(int i,int j) { play_table(); char str[11]; while(cin>>str) { int ok=0; int len=strlen(str); /*检查str是否符合升序排列*/ for(i=1;i<len;i++) if(str[i-1]>=str[i]) { cout<<0<<endl; //本题只要求输入一次就允许结束程序 ok=1; break; } if(ok) continue; int sum=0; //str的值,初始为0 /*计算长度比str小的字符串个数*/ for(i=1;i<len;i++) sum+=c[26][i]; //c[26][i]表示 长度为i的字符串的个数 /*计算长度等于len,但值比str小的字符串个数*/ for(i=0;i<len;i++) //i为str的指针,对每一个位置枚举 允许选择的字符ch { char ch= (!i)?'a':str[i-1]+1; //ch = str[i-1]+1 根据升序规则,当前位置的ch至少要比str前一位置的字符大1 while(ch<=str[i]-1) //ch<=str[i]-1 根据升序规则,当前位置的ch最多只能比 str这个位置实际上的字符 小1 { sum+=c['z'-ch][len-1-i]; //'z'-ch : 小于等于ch的字符不允许再被选择,所以当前能够选择的字符总数为'z'-ch ch++; //len-1-i : ch位置后面(不包括ch)剩下的位数,就是从'z'-ch选择len-1-i个字符 } } cout<<++sum<<endl; // 此前的操作都是寻找比str小的所有字符串的个数,并不包括str本身,因此这里要+1 } system("PAUSE"); return 0; }
相关文章推荐
- POJ 1850 Code POJ 1496 Word Index
- poj 1496 poj 1850
- poj 1496&1850
- poj 1496&1850
- POJ 1496 1850
- 排列组合:poj 1496 Word Index+poj 1850 Code
- POJ 1850/ 1496 组合数学
- Poj 1496 Word Index & Poj 1850 Code (计数 组合数)
- poj 1850 Code 1496 Word Index
- poj 1850 Code(同 poj 1496 Word Index)
- POJ 1496 + 1850 (数论-排列组合) (?)
- poj 1496(1850)/2245 全组合打表(一种字符编码/Lotto)
- 组合数学poj 1496 1850 同样的代码过两题
- POJ 1850 Code ,1496 Word Index(组合计数)
- POJ 1850 Code/POJ 1496 Word Index(组合数学-字母串序号)
- POJ 1850 Code POJ 1496 Word Index
- poj1496(组合数学)-与1850几乎一样
- POJ 1496 Word Index || POJ 1850 Code
- 哈希表入门题目总结(HDU 1280、1425、2027、3833、1496、2648 POJ 1200)
- poj 1850 1019 (简单位数dp)