码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2229 Sumsets

时间:2016-05-15 12:19:26      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

这其实是个递推。

因为1这个元素特殊,所以应该分有没有1来讨论。

如果 n为奇数 那么必然有1 相当于 dp[i]=d[i-1]。

如果 n为偶数 分有没有1

  0.有1      dp[i]=d[i-1]

  1.没有1   dp[i]=d[i>>1]  (因为2 4 8 16可以等价于1 2 4 8 总数是一样的)

63ms的代码

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int maxn=1000005;
 5 const int M=1000000000;
 6 int dp[maxn];
 7 int main()
 8 {
 9     memset(dp,0,sizeof(dp));
10     dp[1]=1;
11     for(int i=2;i<maxn;i++)
12     {
13         if(i&1)
14         {
15             dp[i]=dp[i-1];
16         }
17         else
18         {
19             dp[i]=dp[i>>1]+dp[i-1];
20         }
21         if(dp[i]>M) dp[i]-=M;
22     }
23     int n;
24     while(cin>>n)
25     {
26         cout<<dp[n]<<endl;
27     }
28 
29     return 0;
30 }

 

141ms的代码 

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int maxn=1000005;
 5 const int M=1000000000;
 6 int dp[maxn];
 7 int main()
 8 {
 9     memset(dp,0,sizeof(dp));
10     dp[1]=1;
11     for(int i=2;i<maxn;i++)
12     {
13         if(i&1)
14         {
15             dp[i]=dp[i-1];
16         }
17         else
18         {
19             dp[i]=dp[i>>1]+dp[i-1];
20         }
21         if(dp[i]>M) dp[i]-=M;
22     }
23     int n;
24     while(cin>>n)
25     {
26         cout<<dp[n]<<endl;
27     }
28 
29     return 0;
30 }

 

经验就是!!! ‘ - ’(减)比‘ % ’(求余)要快很多。

这道题如果用完全背包做的话用%会TLE,用-就能A了。

 

poj 2229 Sumsets

标签:

原文地址:http://www.cnblogs.com/luosuo10/p/5494906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!