poj 1636 DP
来源:互联网 发布:mysql解析json函数 编辑:程序博客网 时间:2024/05/17 23:12
这一题要换一个角度来想,在把一个囚犯换到另一个监狱的时候先不要考虑要移对应数量的囚犯回来
用dp【i】【j】表示把监狱1的i个人放到监狱2 把监狱2的j个人放到监狱1 这种情况是否存在
然后最后看 dp【i】【i】存不存在
然后就是背包了
这个背包的物品是什么呢?
就是不能相容的组合 比方说监狱1的 1,2号囚犯不能和监狱2的 1号相容,那么这三个就组成了一个物品 node『 2,1』 如果一个监狱的囚犯没有不相容的,那么该囚犯的物品就是node『1,0』 或者node『0,1』
然后就是裸的dp了
点击打开链接这个里面讲的很好,我没学并查集 所以在预处理出物品的时候直接用DFS来实现的
AC代码如下:
#include <iostream>#include <cstring>#include <string>#include <algorithm>using namespace std;struct Edge{ int to, next;};struct Node{ int num1, num2;};Edge edge[40000];int head[500], tot;int M, N;int num1, num2;bool mark[500];Node node[500], sum;bool dp[200][200];int add_edge( int a, int b ){ edge[tot].to = b; edge[tot].next = head[a]; head[a] = tot++; edge[tot].to = a; edge[tot].next = head[b]; head[b] = tot++; return 0;}int DFS( int pos ){ if( pos >= 1 && pos <= M ){ num1++; }else{ num2++; } mark[pos] = true; for( int i = head[pos]; i != -1; i = edge[i].next ){ int to = edge[i].to; if( !mark[to] ){ DFS( to ); } } return 0;}int main(){ int T; cin >> T; while( T-- ){ cin >> M >> N; memset( head, -1, sizeof( head ) ); tot = 0; for( int i = 0; i < N; i++ ){ int temp1, temp2; cin >> temp1 >> temp2; add_edge( temp1, temp2 + 200 ); } int sum = 0; memset( mark, false, sizeof( mark ) ); for( int i = 1; i <= M; i++ ){ if( !mark[i] ){ num1 = num2 = 0; DFS( i ); node[sum].num1 = num1; node[sum++].num2 = num2; } } for( int i = 1 + 200; i <= M + 200; i++ ){ if( !mark[i] ){ num1 = num2 = 0; DFS( i ); node[sum].num1 = num1; node[sum++].num2 = num2; } } memset( dp, false, sizeof( dp ) ); dp[0][0] = true; for( int k = 0; k < sum; k++ ){ for( int i = M; i >= node[k].num1; i-- ){ for( int j = M; j >= node[k].num2; j-- ){ if( dp[i-node[k].num1][j-node[k].num2] ){ dp[i][j] = true; } } } } int ans = 0; for( int i = M / 2; i >= 0; i-- ){ if( dp[i][i] ){ ans = i; break; } } cout << ans << endl; } return 0;}
0 0
- poj 1636 DP
- POJ 1636 DFS+DP
- poj 1636 DP
- POJ 1636(连通分量+DP)
- 【poj 1636】Prison rearrangement dp
- poj dp
- 【dp】POJ
- 【dp】POJ
- [DP] POJ
- [DP] POJ
- [DP] POJ
- 【dp】POJ
- POJ 3670 && POJ 3671 (dp)
- 【DP】 POJ 1080
- poj 1163经典DP
- poj 1088 滑雪(DP)
- poj 1770 树形dp
- POJ 1179 Polygon(DP)
- Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类 解决办法
- ASCII码与字符
- 站长工具
- 黑马程序员_常用类String&StringBuffer&Math&Random等等
- 时间片轮询法的应用
- poj 1636 DP
- 黑马程序员_数组工具类Arrays和集合工具类Collections
- setTimeout和setInterval的区别你真的了解吗?
- 匿名类、内部类、匿名内部类
- 0053 jar可执行包打包规范--从根源解决资源文件类找不到的问题【基础】
- 黑马程序员_IO流
- 浅谈oracle 存储后台进程和用户进程的debug trace log(上)
- 学校1008: X进制回文数
- SQL SERVER 时间日期处理函数