动态规划——凸多边形最优三角划分

题目描述
给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。

 凸多边形三角剖分如下图所示:

在这里插入图片描述思路:我们看a图v0v3v6这个三角形,把这个凸多边形分成了两个部分,第一个部分:v0v1v2v3,第二个部分v3v4v5v6
我们假设t(i,j)代表顶点{vi-1,vi…vj}所形成的凸多边形的最优三角划分的权函数值,为什么要这样表示呢,因为这样才能保证当i,j不相同时至少有三个点形成多边形,然后当i,j相同时,只有两个点,我们就定义此时的t为0
那么看a图的t(1,6)是不是就大于等于t(1,3)+t(4,6)再加上三角形v0v3v6的权值
v3是我们随便取的,我们可以取1到5任一个数,t(1,6)=当k取其中一个数时最小的那个
那么我们由特殊到一般可得递推关系式
在这里插入图片描述#include<bits/stdc++.h>
using namespace std;
int n;
int a[8][8];//这里我们假定点数不超过8,a代表点之间的权值
int weight(int vi,int vk,int vj )//返回权值的函数
{
return a[vi][vk]+a[vk][vj]+a[vi][vj];
}
int m(int n,int **t)//t[i][j]代表的是顶点为{v(i-1),v(i)…v(j)}时最佳三角剖分函数值,因为这样能保证分成的多边形至少有三个顶点
{
for(int i=1;i<=n;i++) t[i][i]=0;
for(int r=2;r<=n;r++)//r代表的是子问题链的长度,长度从2——n
{
for(int i=1;i<=n-r+1;i++)//i代表的是每一条子问题链的起点+1,n-r+1是最后一条子问题链的起点+1
{
int j=i-1+r;//j代表每一条子问题链的末尾
t[i][j]=t[i+1][j]+weight(i-1,i,j);//初始k为i+0
for(int k=i+1;k<i+r-1;k++)//k从i+1逐渐变大,但不大于末尾
{
int u=t[i][k]+t[k+1][j]+weight(i-1,k,j);
if(u<t[i][j]) t[i][j]=u;
}
}
}
return t[1][n];
}
int main()
{
cin>>n;
int t[n+1][n+1];
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
cin>>a[i][j];
}
}
int *p[n];
for(int i=0;i<=n;i++)
{
p[i]=&t[i][0];
}
cout<<m(n,p);
return 0;
}
最后以二维数组作为参数时,我们要做这个变换。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值