动态规划--凸多边形三角剖分
问题描述
给定凸多边形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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】