东南大学《算法设计基础》课程作业 2 - Dynamic Programming

Question

Answer

Code for #2

#include "pch.h"

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <memory>
#include <queue>
#include <cmath>
#include <ctime>

using namespace std;

#define NINF -99999999
#define NMARKET 8

struct ResultNode {
	int val; // profit
	queue<int> seq; // operation sequence
};

// [prevStatus, opCode]
vector< vector< int > > cb = { {0, 6}, {1, 2}, {0, 3}, // transformed to Have No
			       {1, 6}, {0, 1}, {1, 4}, {0, 5} }; // transformed to Have


int B[NMARKET + 1] = { 0,5,6,7,5,9,7,17,16 };
int S[NMARKET + 1] = { 0,4,9,10,18,12,6,15,18 };

void gen() {
	srand(time(NULL));
	for (int i = 1; i <= NMARKET; i++)
		B[i] = rand() * 10;
	for (int i = 1; i <= NMARKET; i++)
		S[i] = rand() * 5;
	cout << "init ok" << endl;
}

int checkResult() {
	int a[NMARKET + 1][NMARKET + 1] = { 0 };
	for (int i = 1; i <= NMARKET; i++) {
		a[i][i] = max(a[i - 1][i - 1] + S[i] - B[i], a[i - 1][i]);
		for (int j = i + 1; j <= NMARKET; j++) {
			a[i][j] = max(max(a[i][i] + S[j] - B[i], a[i - 1][j]), a[i][j - 1]);
		}
	}
	return a[NMARKET][NMARKET];
}

int F(int i, int j) {
	int r = 0;
	switch (j) {
	case 1:
		r -= B[i]; break;
	case 2:
		r += S[i]; break;
	case 3:
		r -= B[i]; r += S[i]; break;
	case 4:
		r += S[i]; r -= B[i]; break;
	case 5:
		r -= B[i]; r += S[i]; r -= B[i]; break;
	case 6:
		r = 0;
	}
	return r;
}

void printSeq(queue<int> res) {
	int i = 1;
	while (!res.empty()) {
		switch (res.front()) {
		case 1: cout << "(" << i << ","; break;
		case 2: cout << i << "),"; break;
		case 3: cout << "(" << i << "," << i << "),"; break;
		case 4: cout << i << "),(" << i << ","; break;
		case 5: cout << "(" << i << "," << i << "),(" << i << ","; break;
		case 6: break;
		}
		i++;
		res.pop();
	}
	cout << endl;
}

int main() {
	// gen();


	ResultNode dp[NMARKET + 1][2];

	dp[0][0].val = 0;
	dp[0][1].val = NINF;

	for (int i = 1; i <= NMARKET; i++) {
		// xxx -> have no
		for (auto j = cb.begin(); j < cb.begin() + 3; j++) {
			if (dp[i - 1][(*j)[0]].val + F(i, (*j)[1]) > dp[i][0].val) {
				dp[i][0].val = dp[i - 1][(*j)[0]].val + F(i, (*j)[1]);
				dp[i][0].seq = queue<int>(dp[i - 1][(*j)[0]].seq);
				dp[i][0].seq.push((*j)[1]);
			}
		}
		// xxx -> have
		for (auto j = cb.begin() + 3; j < cb.end(); j++) {
			if (dp[i - 1][(*j)[0]].val + F(i, (*j)[1]) > dp[i][1].val) {
				dp[i][1].val = dp[i - 1][(*j)[0]].val + F(i, (*j)[1]);
				dp[i][1].seq = queue<int>(dp[i - 1][(*j)[0]].seq);
				dp[i][1].seq.push((*j)[1]);
			}
		}
	}

	cout << "My max profit is: " << endl;
	cout << dp[NMARKET][0].val << endl;
	
	cout << "The translated operation sequence is: " << endl;
	printSeq(dp[NMARKET][0].seq);
	cout << "The original operation sequence is: " << endl;
	while (!dp[NMARKET][0].seq.empty()) {
		cout << dp[NMARKET][0].seq.front() << " ";
		dp[NMARKET][0].seq.pop();
	}
	cout << endl;

	cout << "The DP array is " << endl;
	for (int i = 0; i <= NMARKET; i++) {
		for (int j = 0; j <= 1; j++)
			cout << dp[i][j].val << " ";
		cout << endl;
	}
	cout << endl;
	cout << "Your max profit is:" << endl;
	cout << checkResult() << endl;

	system("pause");
	return 0;

}

posted @ 2021-01-05 16:01  z0gSh1u  阅读(106)  评论(0编辑  收藏  举报