电路布线
2016-05-25 18:29
148 查看
电路布线
#include<iostream> #include<vector> #include<algorithm> using namespace std; typedef struct line { int i, j; }L; class MNS { public : MNS() { cin >> n; C.assign(n + 1, 0); for (int i = 1; i <= n; i++) { int in; cin >> in; C[i] = in; } vector<int> iv(n+1 , 0); S.push_back(iv); for (int i = 1; i <= n; i++) { vector<int> iv1(n+1, 0); S.push_back(iv1); } } void FindMNS() { //N(1,j) for (int i = 1; i <= n; i++) { if (i < C[1]) { S[1][i] = 0; } else { S[1][i] = 1; } } //N(i,j) . i > 1; for (int i = 2; i <= n; i++) { for (int j = 1; j <= n; j++) { if (j < C[i]) { S[i][j] = S[i - 1][j]; } else { S[i][j] = max(S[i - 1][j], S[i - 1][C[i] - 1] + 1); } } } } void TraceBack(int i , int j) { if (i != 0) { if (j >= C[i]) { if (S[i][j] == S[i - 1][C[i] - 1] + 1) { M.push_back({ i , C[i] }); TraceBack(i - 1, C[i]-1); } else { TraceBack(i - 1, j); } } else { TraceBack(i - 1, j); } } } void Print() { cout << endl; cout << "OutPut :" << endl; for (int i = 1; i <= n; i++) { cout << C[i]<<" "; } cout << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << S[i][j]<<" "; } cout << endl; } cout << endl; TraceBack(n, n); for (int i = 0; i < M.size(); i++) { cout << "(" << M[i].i << " , " << M[i].j << ")" << endl; } } public : vector<int> C;//接线柱的某种连接方案,一种排列 vector<vector<int> > S;//|M[i][j]| vector<L> M;//最大不相交子集 int n; }; MNS mns; int main() { mns.FindMNS(); mns.Print(); return 0; }
相关文章推荐
- python海龟绘图实例教程
- 动态规划 (一)
- 4768 跳石头
- 解决viewpager中两个item循环左右滑动出现崩溃问题
- VI设计通过企业文化传播企业VI设计视觉感受
- CentOS-6上安装二进制Mariadb
- 【REACT NATIVE 系列教程之七】统一ANDROID与IOS两个平台的程序入口&&区分平台的组件简介...
- 【REACT NATIVE 系列教程之七】统一ANDROID与IOS两个平台的程序入口&&区分平台的组件简介
- P-N学习
- 解决导入其他项目时文件乱码
- iOS中assign,copy,retain之间的区别以及weak和strong的区别,NSString什么时候用copy,什么时候用strong
- [RxJS] Filtering operators: skipWhile and skipUntil
- Linux命令
- Linux定时任务crontab执行脚本出错
- navicat内的主键和外键
- 【python练习】截取网页里最新的新闻
- Leetcode 之Count and Say(35)
- linux 系统监控、诊断工具之 IO wait
- Session的工作机制详解和安全性问题(PHP实例讲解)
- springMVC 接收阿里回调接口