POJ Multiplication Puzzle

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int dp[105][105];
int a[105];
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	//memset(dp, 0x3f3f3f, sizeof(dp));//注意初始化问题
	memset(dp, 0, sizeof(dp));
	for (int len = 2; len <= n; len++)//规定长度,求出每种长度对应的最佳情况
	{
		for (int i = 1; i <= n-len+1; i++)//理解长度控制问题
		{
			int j =i+len-1;//规定长度,注意长度的控制
			dp[i][j] = 0x3f3f3f3f;//每种情况的初始化,每种长度的最佳情况的初始化,注意动态规划时注意初始化问题
			for (int k = i; k < j; k++)//注意规定最后一个元素的位置
			{
				 dp[i][j] =min( dp[i][j],dp[i][k] + dp[k + 1][j] + a[i - 1] * a[k] * a[j]);//注意矩阵相乘时行列的相乘的规律
			}//区间分割进行动态规划
		}
	}
	printf("%d\n", dp[2][n]);
	getchar();
	getchar();
	return 0;
}

(注意利用此图进行矩阵链乘的理解)(转载)

1、注意对最优矩阵链乘问题的转换,求最少运算次数,利用矩阵的行列进行区分,求解最少的运算次数
2、dp[i][j]代表第i个矩阵到第j个矩阵最少的运算次数,比如对于Ai-Aj,利用中间变量k进行区间的划分,此处注意理解矩阵相乘特点,前一矩阵行与后一矩阵的列相等时可相乘, 一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。
3、len变量用于控制长度,每次寻找规定长度的最佳方案,即求解最佳子方案(分割求解的思想)

4、此处易错点,注意循环中边界的控制,k<j,注意细节点的控制,i<=n-len+1,对应不同的长度对应不同的边界,注意想清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值