BZOJ 1190: [HNOI2007]梦幻岛宝珠
2016-03-22 16:19
471 查看
好难的分层DP TAT
把WTY大爷的话读了好几遍,并不是很懂(然后就把代码抄了一遍)
话说这代码跑得略慢了。。。。。。。
突然发现是200题纪念哎
把WTY大爷的话读了好几遍,并不是很懂(然后就把代码抄了一遍)
话说这代码跑得略慢了。。。。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; int f[40][1005]; int n,w; int dp(){ int ans=0; for(int i=1;i<=30&&(1<<i)<=w;i++) for(int j=min(1000,w>>i);j>=0;ans=max(ans,f[i][j--])) for(int k=0;k<=j;k++) f[i][j]=max(f[i][j],f[i][j-k]+f[i-1][min((k<<1)+((w>>i-1)&1),1000)]); return ans; } int main(){ //freopen("a.in","r",stdin); while(scanf("%d%d",&n,&w)&&n>0){ memset(f,0,sizeof(f)); for(int i=1;i<=n;i++){ int a,v,b=0;scanf("%d%d",&a,&v); while(~a&1)a>>=1,b++; for(int j=1000;j>=a;j--) f[b][j]=max(f[b][j],f[b][j-a]+v); } for(int i=0;i<=30;i++) for(int j=1;j<=1000;j++) f[i][j]=max(f[i][j],f[i][j-1]); int ans=0; for(int i=0;i<=min(1000,w);i++)ans=max(ans,f[0][i]); printf("%d\n",max(dp(),ans)); } return 0; }
突然发现是200题纪念哎
相关文章推荐
- 内部系统间调用client包的封装方法
- oracle中的游标
- Linux内核分析5
- UIPasteboard 粘贴板
- Swift iOS 日期操作:NSDate、NSDateFormatter
- Java——Swing
- iOS状态栏颜色的修改
- 经典排序算法 - 冒泡排序Bubble sort
- 最适合程序员转行的10大职业
- 【cocos2dx-1】安卓打包报错
- spring + mybatis 创建项目
- Runtime 归档 , KVC , 分类添加属性 , 关联等用法.
- hdu 2087 剪花布条 求模式串在主串中的个数
- servlet 生命周期 和 作原理详解
- Android访问网络,使用HttpURLConnection还是HttpClient?
- JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类
- HTTP请求过程
- JavaScript学习笔记(三)this关键字
- 百度深圳2面-2016-3-22
- 麦咖啡阻挡正常打开Excel文件