POJ 1850 Code && 1496 Word Index 组合数学
2012-08-06 11:34
267 查看
来源:http://poj.org/problem?id=1850 && http://poj.org/problem?id=1496
题意:两道题一样,一样的代码就可以过。就是说26个字母各对应一个整数,ab对应27,ac对应28.。。。这样对应下去,需要注意的是字符串必须是升序的,即后面的字符必须比前面的字符大。
思路:网上说是组合原理的应用,不过我没发现哪里用到了组合数学的知识,感觉就是一道普通的模拟题。想清楚就可以了。我做的时候是开了一个dp[27][27]的数组,dp[i][j]表示的是长度为i,以j开头的字符的序号,也就是对应的数字,并且用num[i][j]记录以长度为i,以j开头的字符有多少个。然后输入一个字符串,算就可以了。
代码:
题意:两道题一样,一样的代码就可以过。就是说26个字母各对应一个整数,ab对应27,ac对应28.。。。这样对应下去,需要注意的是字符串必须是升序的,即后面的字符必须比前面的字符大。
思路:网上说是组合原理的应用,不过我没发现哪里用到了组合数学的知识,感觉就是一道普通的模拟题。想清楚就可以了。我做的时候是开了一个dp[27][27]的数组,dp[i][j]表示的是长度为i,以j开头的字符的序号,也就是对应的数字,并且用num[i][j]记录以长度为i,以j开头的字符有多少个。然后输入一个字符串,算就可以了。
代码:
//1850 1496 #include <iostream> #include <cstdio> #include <string.h> #include <string> using namespace std; #define CLR(arr,val) memset(arr,val,sizeof(arr)) typedef long long LL; const int N = 27; LL dp , num ; bool fun(string ss){ bool flag = true; for(int i = 0; i < ss.size() - 1; ++i){ if(! (ss[i+1] > ss[i] )){ flag = false; break; } } return flag; } void init(){ CLR(dp,0); CLR(num,0); for(int i = 1; i < N; ++i){ dp[1][i] = i; num[1][i] = 1; } for(int i = 2; i < N; ++i){ for(int j = 1; j + i <= N; ++j){ LL sum = 0; for(int k = 1; k + i - 1<= N; ++k) sum += num[i-1][k]; if(j == 1) dp[i][j] = dp[i-1][j] + sum; else dp[i][j] = dp[i][j-1] + num[i][j-1]; LL sum1 = 0; for(int k = j+1; k + i - 1 <= N; ++k) sum1 += num[i-1][k]; num[i][j] = sum1; } } } int main(){ //freopen("2.txt","w",stdout); init(); string ss; while(cin>>ss){ if(! fun(ss)){ printf("0\n"); continue; } int len = ss.size(); int x = ss[0] - 'a' + 1; LL id = dp[len][x]; for(int i = 1; i < len; ++i){ int y = ss[i] - 'a' + 1; x = ss[i-1] - 'a' + 1; LL sum = 0; for(int j = x + 1; j < y; ++j) sum += num[len - i][j]; id += sum; } printf("%lld\n",id); } return 0; }
相关文章推荐
- poj 3975&&hdu 1850 (nim)
- poj 1496&1850
- poj 1496&1850
- POJ 1850 &&POJ 1496 Code 杨辉三角+组合数
- Poj 1496 Word Index & Poj 1850 Code (计数 组合数)
- poj 组合数 1850 Code
- 【poj 1850】Code 题意&题解&代码(C++)
- poj&nbsp;1850&nbsp;Code&nbsp;递推
- poj 3975&&hdu 1850 (nim)
- POJ 2348& HDU 2147&HDU 1846&POJ 1067&HDU 1850 简单的博弈
- POJ2418 二叉排序树 && 字典树写法
- POJ 2485:Highways(最小生成树&&prim)
- poj 1700 Crossing River && nyoj 47 过河问题
- POJ 1861 && ZOJ 1542--Network 【最小生成树 && kruscal && 水题】
- POJ 1519 && HDU 1013 Digital Roots(数论)
- nyoj--586(疯牛) && poj --2456
- POJ 1061 && POJ 2142 两道扩展欧几里得简单题
- poj1787 Charlie's Change
- poj 1681 Painter's Problem (高斯消元)
- POJ 1151 & HDU 1542 Atlantis(扫描线模板 线段树 离散化)