火柴 UVa11375

5 篇文章 0 订阅
5 篇文章 0 订阅

1.题目描述:点击打开链接

2.解题思路:本题利用递推关系解决。首先可以把“已经使用过的火柴数i”看做状态,可以得到一个图,从前往后每添加一个数字x,就从状态i转移到了i+c[x],其中c[x]代表数字x需要的火柴数。当i=0时不允许使用数字0(当n≥6,给答案单独加上1,代表整数0)。令d(i)表示从结点0到结点i的路径条数,则答案为f(n)=d(1)+d(2)+...+d(n)。

程序实现时,我们可以按照从小到大的顺序用d(i)更新所有的d(i+c[j])(j取遍数字0~9)。由于结果非常大, 需要使用高精度模板存储结果。

3.代码:


 
 
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<string>
  5. #include<sstream>
  6. #include<set>
  7. #include<vector>
  8. #include<stack>
  9. #include<map>
  10. #include<queue>
  11. #include<deque>
  12. #include<cstdlib>
  13. #include<cstdio>
  14. #include<cstring>
  15. #include<cmath>
  16. #include<ctime>
  17. #include<functional>
  18. using namespace std;
  19. typedef long long ll;
  20. typedef unsigned long long ull;
  21. typedef pair< int, int> P;
  22. typedef pair< long long, long long> PL;
  23. #define me(s) memset(s,0,sizeof(s))
  24. #define For(i,n) for(int i=0;i<(n);i++)
  25. #define N 2000+10
  26. int n;
  27. int c[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
  28. struct Node
  29. {
  30. int p[ 500];
  31. int len;
  32. Node()
  33. {
  34. me(p); len = 0;
  35. }
  36. Node( int a)
  37. {
  38. p[ 0] = a;
  39. len = 1;
  40. }
  41. Node operator +( const Node&a) const
  42. {
  43. Node b;
  44. b.len = max(len, a.len);
  45. For(i, b.len)
  46. {
  47. b.p[i] += p[i] + a.p[i];
  48. b.p[i + 1] = b.p[i] / 10;
  49. b.p[i] %= 10;
  50. }
  51. if (b.p[b.len] > 0)b.len++;
  52. return b;
  53. }
  54. void out()
  55. {
  56. if (!len) puts( "0");
  57. else{
  58. for ( int i = len - 1; i >= 0; i--)
  59. printf( "%d", p[i]);
  60. puts( "");
  61. }
  62. }
  63. }d[N];
  64. void init()
  65. {
  66. d[ 0].p[ 0] = 1;
  67. d[ 0].len = 1;
  68. For(i, 2001)
  69. {
  70. For(j, 10)
  71. if (i + c[j] < 2001 && !(i == 0 && j == 0)) //i=j=0时不允许转移
  72. d[i + c[j]] = d[i + c[j]] + d[i];
  73. }
  74. d[ 6] = d[ 6] + Node( 1);
  75. for ( int i = 2; i < 2001; i++)
  76. d[i] = d[i] + d[i - 1];
  77. }
  78. int main()
  79. {
  80. //freopen("t.txt", "r", stdin);
  81. init();
  82. while ( cin >> n)
  83. {
  84. d[n].out();
  85. }
  86. return 0;
  87. }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值