动态规划练习
题目描述:
苹果装配问题,把一个区域分成n*m个小区域,其中每个区域有一定数量的苹果,设左上角为0,0,右下角为n-1,m-1.从0,0开始出发,每经过一个区域,就把该区域的苹果全部收走,求一条路径使得收获的苹果最多。
#include<iostream> #include<vector> using namespace std; class state { public: int prex; int prey; int num; state() :prex(0), prey(0) , num(0) {}; }; int main() { int n = 5; int m = 4; vector<vector<int>> mat= { {1,3,4,5},{2,6,8,0},{4,7,2,8},{3,5,7,2},{6,3,8,4} }; vector<vector<state>> state(5,vector<state>(4)); cout << "start" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (i == 0 && j == 0) { state[i][j].num = mat[i][j]; state[i][j].prex = -1; state[i][j].prey = -1; //cout << state[i][j].num; cout << "(" << i << "," << j << ")" << "(" << state[i][j].prex << "," << state[i][j].prey << ")" << ":" << state[i][j].num << "<-"; } if (i == 0 && j != 0) { state[i][j].num = state[i][j - 1].num + mat[i][j]; state[i][j].prex = i; state[i][j].prey = j - 1; //cout << state[i][j].num; cout << "(" << i << "," << j << ")" << "(" << state[i][j].prex << "," << state[i][j].prey << ")" << ":" << state[i][j].num << "<-"; } if (i != 0 && j == 0) { state[i][j].num = state[i - 1][j].num + mat[i][j]; state[i][j].prex = i-1; state[i][j].prey = j; cout << "(" << i << "," << j << ")" << "(" << state[i][j].prex << "," << state[i][j].prey << ")" << ":" << state[i][j].num << "<-"; } if (i != 0 && j != 0) { if (state[i][j - 1].num > state[i - 1][j].num) { state[i][j].num = state[i][j - 1].num+mat[i][j]; state[i][j].prex = i; state[i][j].prey = j-1; cout << "(" << i << "," << j << ")" << "(" << state[i][j].prex << "," << state[i][j].prey << ")" << ":" << state[i][j].num << "<-"; } else { state[i][j].num = state[i - 1][j].num + mat[i][j]; state[i][j].prex = i - 1; state[i][j].prey = j; cout << "(" << i << "," << j << ")" << "(" << state[i][j].prex << "," << state[i][j].prey << ")" << ":" << state[i][j].num << "<-"; } } } } int i = n-1; int j = m-1; cout << "finish" << endl; while (i != -1 || j != -1) { cout << "(" << i << "," << j << ")" << ":"<< state[i][j].num<<" "; int k = i; i = state[k][j].prex; j = state[k][j].prey; } cout << endl; system("pause"); return 0; }

浙公网安备 33010602011771号