IEEE极限编程之The pipeline-动态规划思想

来源:互联网 发布:java电脑版86安装包 编辑:程序博客网 时间:2024/04/30 18:35

题目:




代码:

#include<iostream>#include<vector>#include<list>#define NUM 100using namespace std;class solution{public:void search_route(int cost[][NUM], int num[][NUM]){result.second.clear();int min = INT_MAX, row, column = NUM - 1, temp;for (int i = 0; i < NUM; i++){if (cost[i][NUM - 1] < min){min = cost[i][NUM - 1];row = i;//最小cost的行数}}result.first = min;result.second.push_back(make_pair(row, column));while (column != 0){bool flag = false;temp = cost[row][column] - num[row][column];if (row - 1 >= 0 && flag == false){//向上移动if (temp == cost[row - 1][column]){row -= 1;result.second.push_back(make_pair(row, column));flag = true;}}if (column - 1 >= 0 && flag == false){//向左移动if (temp == cost[row][column - 1]){column -= 1;result.second.push_back(make_pair(row, column));flag = true;}}if (row + 1<NUM && flag == false){//向下移动if (temp == cost[row + 1][column]){row += 1;result.second.push_back(make_pair(row, column));flag = true;}}}}pair<int, vector<pair<int, int>>>The_pipeline(int num[][NUM], int cost[][NUM], int row, int column){//开始坐标list<pair<int, int>>que;if (cost[row][column] > num[row][column]){cost[row][column] = num[row][column];que.push_back(make_pair(row, column));}list<pair<int, int>>::iterator iter = que.begin();int temp;while (iter != que.end()){//能否向上移动if (iter->first - 1 >= 0){temp = cost[iter->first][iter->second] + num[iter->first - 1][iter->second];if (temp < cost[iter->first - 1][iter->second]){que.push_back(make_pair(iter->first - 1, iter->second));cost[iter->first - 1][iter->second] = temp;}}//能否右移动if (iter->second + 1 < NUM){temp = cost[iter->first][iter->second] + num[iter->first][iter->second + 1];if (temp < cost[iter->first][iter->second + 1]){que.push_back(make_pair(iter->first, iter->second + 1));cost[iter->first][iter->second + 1] = temp;}}//能否向下移动if (iter->first + 1 < NUM){temp = cost[iter->first][iter->second] + num[iter->first + 1][iter->second];if (temp < cost[iter->first + 1][iter->second]){que.push_back(make_pair(iter->first + 1, iter->second));cost[iter->first + 1][iter->second] = temp;}}iter++;}search_route(cost, num);return result;}pair<int, vector<pair<int, int>>>result;};int main(){//int cost[NUM][NUM], num[NUM][NUM] = { { 1, 1, 9, 1, 1, 3 }, { 3, 1, 9, 7, 1, 4 }, { 4, 1, 9, 1, 1, 2 }, { 5, 1, 1, 1, 5, 2 }, { 6, 1, 9, 3, 1, 3 }, { 3, 1, 4, 2, 1, 2 } };int cost[NUM][NUM], num[NUM][NUM];int min_value = INT_MAX;solution aa;pair<int, vector<pair<int, int>>>re,minimun;//first部分表示代价综合,后部分表示该代价下的路径for (int i = 0; i < NUM; i++){re.first = 0;re.second.clear();for (int i = 0; i < NUM; i++){for (int j = 0; j < NUM; j++){cost[i][j] = INT_MAX;do{num[i][j] = rand() % 20;} while (num[i][j] == 0);}}re = aa.The_pipeline(num,cost, i, 0);for (int j = 0; j < (int)re.second.size() / 2; j++){pair<int, int>tmp;tmp = re.second[j];re.second[j] = re.second[re.second.size() - j - 1];re.second[re.second.size() - j - 1] = tmp;}if (re.first < min_value){min_value = re.first;minimun = re;}}cout << "Thie minimun cost is :" << min_value << endl;return 0;}
该问题的递归方程为:

min[i][j]=min{min[i-1][j],min[i+1][j],min[i][j-1]}+num[i][j];

其中min[i][j]表示截止挖到[i,j]的最小代价值,num[i][j]表示需要在[i,j]挖通管道的代价.

如有问题,email联系.


0 0