动态规划练习

题目描述:

苹果装配问题,把一个区域分成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;
}

 

posted @ 2019-12-09 15:49  akatsukiaoi18  阅读(97)  评论(0)    收藏  举报