动态规划--凸多边形三角剖分

问题描述

给定凸多边形P,以及由多边形的边和弦组成的三角形上的权函数w,求该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和最小。

解决思路

  • 定义t[i][j],为凸子多边形{vi-1,vi,...,vj}的最优三角剖分所对应的权值,即其最优值,其中1≤i<j≤n
  • 设退化的多边形{vi-1,vi}具有权值0,即t[i][i]=0
  • 则要计算的凸(n+1)边形P的最优权值为t[1][n]
  • vi-1和vj之间有j-i个点

具体问题

按照逆时针顺序给定n凸多边形的n个顶点坐标,现在连接凸多边形内部的顶点,使得凸多边形分割为若干三角形,注意连线不可相交。
每条线的权值为两点之间的距离,所有连线的权值和为当前方案的权值,现在需要你计算所有方案中最小权值和。

代码实现

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 110;

int n;
double w[N][N], t[N][N];
struct Node{
	int x, y;
}g[N];

void CalWeight()
{
	for(int i = 0; i < n; i ++ )
		for(int j = 0; j < n; j ++ )
		{
			double t;
			t = (g[i].x - g[j].x) * (g[i].x - g[j].x) + (g[i].y- g[j].y) * (g[i].y - g[j].y);
			w[i][j] = sqrt(t);
		}
}

double W(int i, int k, int j)
{
	return w[i][k] + w[k][j] + w[i][j];
}

double zhouchang(int n)
{
	double sum = 0;
	for(int i = 0; i < n; i ++ )
	{
		int j = i + 1;
		if(j == n) j = 0;
		sum += w[i][j];
	}
	
	return sum;
}


int main()
{
	cin >> n;
	memset(t, 0x3f, sizeof t);
	for(int i = 0; i < n; i ++ )
	{
		int a, b;
		cin >> a >> b;
		g[i] = {a, b};
		t[i][i] = 0;
	}

	CalWeight();

	for(int r = 2; r <= n; r ++ )
		for(int i = 1; i + r - 1 <= n; i ++ )
		{
			int j = i + r - 1;
			t[i][j] = t[i + 1][j] + W(i - 1, i, j);
		//	printf("i=%d, j=%d, t[1][3]=%f\n", i, j, t[1][3]); 
			for(int k = i + 1; k < j; k ++ )
			{
				double u = t[i][k] + t[k + 1][j] + W(i - 1, k, j);
				if(u < t[i][j]) t[i][j] = u;
			}
		}
			
	
	cout << (t[1][n - 1] - zhouchang(n)) / 2.0 << endl;

	return 0;
}
posted @   esico  阅读(203)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示