标签:
这其实是个递推。
因为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了。
标签:
原文地址:http://www.cnblogs.com/luosuo10/p/5494906.html