[逆向DP]UVa10118 - Free Candies
2015-09-24 01:11
381 查看
篮子里的状态就是取出的糖果堆得状态
所以用4维数组表示糖果堆得状态就行了
每次两种选择:
选一个糖果和篮子中的消除,或者选一个糖果放到篮子中。
判断是否相同还用到了位运算符
把每个颜色换成二进制数代表 就是一个某位上的二进制1
然后判颜色的时候就好判了
如果&为1,就说明篮子里已经有了
删掉的时候直接减就可以
所以用4维数组表示糖果堆得状态就行了
每次两种选择:
选一个糖果和篮子中的消除,或者选一个糖果放到篮子中。
判断是否相同还用到了位运算符
把每个颜色换成二进制数代表 就是一个某位上的二进制1
然后判颜色的时候就好判了
如果&为1,就说明篮子里已经有了
删掉的时候直接减就可以
#include<bits/stdc++.h> using namespace std; const int N = 41; int n; int dp ; int mat [4]; int DP(int *top,int st,int k){ int &m=dp[top[0]][top[1]][top[2]][top[3]]; if(m!=-1) return m; if( top[0]==n &&top[1]==n&&top[2]==n &&top[3]==n||k==5) return m=0; for(int i=0;i<4;i++) if(top[i]<n){ int bit=1<<mat[top[i]][i]; top[i]++; if(bit&st) m = max(m,DP(top,st-bit,k-1)+1); else if(k<5) m = max(m,DP(top,st+bit,k+1)); top[i]--; } return m; } int main() { while(scanf("%d",&n),n){ memset(dp,-1,sizeof(dp)); for(int i=0;i<n;i++) for(int j=0;j<4;j++) scanf("%d",&mat[i][j]); int top[5]={0}; printf("%d\n",DP(top,0,0)); } return 0; }
相关文章推荐
- [C++基础]在构造函数内部调用构造函数
- 第二次作业
- ReactiveCocoa比较区分replay, replayLast和replayLazily
- 第一次博客作业
- Android图片的三级缓存
- 安装oracle11g并配置plsqldev客户端
- 源码分析Mms--ConversationList短信主界面会话列表
- Android病毒查杀原理
- 第2次作业(个人项目实践)
- 看书的收获
- centos 6.5 安装mysql
- android问题汇总
- Android_Intent大全,Intent激活系统应用
- Swift - 文本输入框(UITextField)的用法
- Binary Tree Inorder Traversal
- Python新浪微博爬虫程序
- AndroidPopupWindow的用法
- [OOD]违反里氏替换原则的解决方案
- ffmpeg 中添加264支持
- java 数据库连接池配置问题