예제 #1
0
	void MatrixChainSolver::editResult(const vector<vector<Record>>& records, int b, int e, string& str) const
	{
		if (b == e)
			str += string("M") + boost::lexical_cast<string>(b);
		else
		{
			str += "(";
			editResult(records, b, records[b][e].middle, str);
			editResult(records, records[b][e].middle + 1, e, str);
			str += ")";
		}
	}
예제 #2
0
	long MatrixChainSolver::solve(string& format) const
	{
		auto size = matrices_.size();
		vector<vector<Record>> records;

		for (int i = 0; i < size; ++i)
		{
			vector<Record> temp;
			auto r = Record(i);
			for (int i = 0; i < size; ++i)
				temp.push_back(r);
			records.push_back(temp);
		}

		/*
		 * 加入第i个矩阵Ai后,最小的cost为下面情况之一
			Min(A1A2...Ai-1) * Min(Ai)
			Min(A1A2...Ai-2) * Min(Ai-1Ai)
			...
			Min(A1A2) * Min(A3A4...Ai)
			Min(A1) * Min(A2A3...Ai)
		 * 而Min(AjAj+1...Ai)则又可以由Min(Aj...Ak) * Min(Ak...Ai)得到
		 */
		for (int i = 1; i < size; ++i) // 添加第i个矩阵
		{
			for (int j = i - 1; j >= 0; --j) // 计算records[j][i]的最小值
			{
				auto minCost = records[j][i - 1].cost + records[i][i].cost
					+ matrices_[j]->nRow_ * matrices_[i-1]->nColumn_ * matrices_[i]->nColumn_;
				auto minMiddle = i - 1;
				for (int k = i - 2; k >= j; --k)
				{
					auto temp = records[j][k].cost + records[k + 1][i].cost
						+ matrices_[j]->nRow_ * matrices_[k]->nColumn_ * matrices_[i]->nColumn_;
					if (minCost > temp)
					{
						minCost = temp;
						minMiddle = k;
					}
				}
				records[j][i].cost = minCost;
				records[j][i].middle = minMiddle;
			}
		}
		/*
		 * 编辑计算顺序
		 */
		editResult(records, 0, size - 1, format);
		return records[0][size - 1].cost;
	}
예제 #3
0
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->operation->addItem("+");
    ui->operation->addItem("-");
    ui->operation->addItem("*");
    ui->operation->addItem("/");

    connect(ui->argument1, SIGNAL(valueChanged(int)), this, SLOT(editResult()));
    connect(ui->operation, SIGNAL(currentTextChanged(QString)), this, SLOT(editResult()));
    connect(ui->argument2, SIGNAL(valueChanged(int)), this, SLOT(editResult()));
}