UVa 1331 最大面積最小的三角剖分 dp

2022-09-13 05:15:10 字數 1331 閱讀 8018

一共有4條邊,我們可以以隨意的順序切割,不過如果這樣的話,就會出現類似v0v3v4v6這樣的多邊形,這樣的多邊形很難用簡潔的狀態表示出來,這就是讓我一開始很糾結的地方。

其實我們會發現,對於同一種切割方法,我們可以有多種切割順序,但我們只要計算一種就好了,不如把決策順序規範化。例如還是上面第一張圖,我們可以先切割出三角形v0v3v6,那麼我們切割完之後可以把圖分割成乙個三角形和兩個多邊形,而組成這兩個個多邊形的點的編號都是連續的。

於是我們可以得出一種切割方法,比如我要切割多邊形i,i+1,…,j-1,j(i < j),那麼我下一步切割的三角形一定有i和j這兩個點(這樣的規定並不會出錯,因為無論我們如何切割,分出來的三角形中一定有乙個過i和j),而這樣的切割方法的優點是保證了每次切出來的多邊形組成的點的編號都是連續的,於是我們就可以用兩個元素表示乙個多邊形的狀態了,這樣dp轉移方程很容易可以得出來:

d(i,j)=min;

其中,s(i,j,k)為三角形i-j-k的面積。不過此時需要保證i-j是對角線(唯一的例外是i=0且j=n-1),具體做法是當邊i-j不滿足條件時直接設為inf,其他部分和凸多邊形的情形完全一樣。

這裡用海**式計算三角形面積

用面積差判斷三角形內部是否有點

明確了這些進行dp

最後答案在d[1][n]中

d[i][j]表示的是以i,j為邊界不包含序號1的點的多邊形裡最大三角形面積最小值

#include

#include

#include

#include

using

namespace

std;

#define maxn 50

#define inf 0x7fffffff

#define eps 0.0001

struct point

p[maxn+5];//點

int n;

double d[maxn+5][maxn+5];//動歸

double dis(int x,int y)//計算兩點距離

double area(int x,int y,int z)//計算由點x,y,z構成的三角形的面積(海**式)

bool check(int x,int y,int z)//判斷由點x,y,z構成的三角形中有沒有點

return1;}

int main()

printf("%.1lf\n",d[1][n]);

memset(d,0,sizeof(d));}}

島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...

島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...

島嶼的最大面積

題目 給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 ...