动态规划之最优三角分割(2021/2/3)

问题引入

在这里插入图片描述

代码实现
#include<iostream>
using namespace std;
#define N 1000
int map[N][N];//图的邻接矩阵
int strategy[N][N];//记录i j 中间的最优割点
int m[N][N];//记录i j之间切割的最优权重 

//三角切割 
void convex_triangular_cutting(int n){
	//初始化最优权重与策略矩阵
	for(int i=0;i<n;i++){
		strategy[i][i]=0;
		map[i][i]=0;
	} 
	//从有三个顶点的问题开始,step迭代到解决n个顶点的问题 
	for(int step=2;step<n;step++){ 
		for(int i=1;i<n-step+1;i++){//问题的起顶点 i-1
			int j=i+step-1;//问题终顶点
			//初始m[i][j] 与 最优策略分割顶点
			m[i][j]=m[i+1][j]+map[i-1][i]+map[i][j]+map[i-1][j];
			strategy[i][j]=i;
			//寻找i-1 j之间的最优切割点k
			for(int k=i+1;k<j;k++){
				int temp=m[i][k]+m[k+1][j]+map[i-1][k]+map[k][j]+map[i-1][j];
				if(m[i][j]>temp){
					m[i][j]=temp;//更新最优权重与切割点 
					strategy[i][j]=k;
				}
			}
			
		} 
	}
}
//输出所有弦
void print_result(int i,int j){
	if(i==j){
		return;
	}
	if(strategy[i][j]>i){//i-1 j问题,最优切割点大于i,因为i等于不切割 
		cout<<"  {"<<i-1<<","<<strategy[i][j]<<"}  ";
	}
	if(strategy[i][j]+1<j){//i-1 j问题,最优切割点小于j-1 ,为j-1等于不切割 
		cout<<"  {"<<strategy[i][j]<<","<<j<<"}  ";
	}
	print_result(i,strategy[i][j]);
	print_result(strategy[i][j]+1,j);
} 

int main(int argc,char**argv){
	int n=0;
	cout<<"输入顶点个数\n";
	cin>>n;
	cout<<"依次输入各顶点的连续权值\n";
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>map[i][j];
		}
	}
	convex_triangular_cutting(n);
	print_result(1,n-1);//打印结果 
	return 0;
}
输入输出样例
输入顶点个数
6
依次输入各顶点的连续权值
0 2 3 1 5 6
2 0 3 4 8 6
3 3 0 10 13 7
1 4 10 0 12 5
5 8 13 12 0 3
6 6 7 5 3 0
  {0,3}    {3,5}    {0,2}
--------------------------------
Process exited after 3.454 seconds with return value 0
请按任意键继续. . .

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高万禄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值