hdu 4906——Our happy ending
2015-07-31 18:44
369 查看
题意:数组长度是n,最大元素是L,且数组中存在几个元素的和是T。求有多少个这样的数组。
思路:状态压缩。t最大就20。用一个int表示状态。在前i个数中,如果存在几个元素的加和为i,那么第i为就为1,否则为0.这样就把状态表示出来了。最后的答案是所有的第t位为1的状态的和。
没有优化空间导致MLE了一次。在求可以到达的状态的时候,一位一位来求没有直接一次位移解决TLE了一次。。。
代码如下:
思路:状态压缩。t最大就20。用一个int表示状态。在前i个数中,如果存在几个元素的加和为i,那么第i为就为1,否则为0.这样就把状态表示出来了。最后的答案是所有的第t位为1的状态的和。
没有优化空间导致MLE了一次。在求可以到达的状态的时候,一位一位来求没有直接一次位移解决TLE了一次。。。
代码如下:
[code]#include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<cstdio> #include<map> #include<cmath> #include<assert.h> #include<iomanip> #include<assert.h> using namespace std; typedef long long ll; const ll mod = 1000000007; ll dp[2][1<<21]; int main() { // freopen("data.txt","r",stdin); int T; scanf("%d",&T); while(T--){ int n,K,L; scanf("%d%d%d",&n,&K,&L); memset(dp,0,sizeof(dp)); int now = 0; dp[0][1] = 1; now = 1; for(int i = 1;i<=n;++i){ memset(dp[now],0,sizeof(dp[now])); for(int j = 0;j<(1<<(K+1));++j){ if(dp[now^1][j]==0)continue; for(int k =0;k<=min(K,L);++k){ int s = j; s = s|(1<<k)|(j<<k); s = s & ((1<<(K+1))-1); dp[now][s] += dp[now^1][j]; dp[now][s] %= mod; } dp[now][j] += (dp[now^1][j]*(L-min(K,L)))%mod; dp[now][j] %= mod; } now = now^1; } ll ans = 0; for(int j = (1<<K) ;j<(1<<(K+1));++j){ ans += dp[now^1][j]; ans%=mod; } cout<<ans<<endl; } return 0; }
相关文章推荐
- 苹果开发 笔记(55)NSURLConnection
- Android studio 安装中遇到一些问题的解决办法,分享一下
- IOS时间格式转换
- unity-Animation
- Android 布局详解 -三表格布局(TableLayout)以及重要属性
- (10)unity入门,unity的应用VR、AR
- Android5.0 Framework框架源码剖析声明
- 五毛的cocos2d-x学习笔记07-计时器、数据读写、文件读写
- Jenkins、Git、CocoaPods、Fir.im 实现 iOS 应用持续集成
- 【Unity3D ugui】使用艺术字
- Android ViewPager多页面滑动切换以及动画效果
- Unity5的AssetBundle的一点使用心得
- 快速上手Gobject
- android的问号?和@符号的含义
- Android 代码混淆 选项说明
- Android手机Root授权原理细节全解析
- android防止重复点击事件的发生笔记
- ios--NSCalendar NSDateComponents
- iOS-JS交互 (WebViewJavascriptBridge)
- Android:onItemClickListener无效