日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ-3537

發(fā)布時(shí)間:2023/12/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ-3537 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:給你一個(gè)n (n<=300) 邊形,給出它所有的頂點(diǎn)坐標(biāo),讓你把它劃分成n-2個(gè)三角形的花費(fèi)最小值,頂點(diǎn) a 和 b 相連的花費(fèi)為

abs(a.x+b.x)*abs(a.y+b.y)。 如果是凹多邊形輸出無(wú)解。

?

思路:先跑個(gè)凸包判斷是不是凸多邊形,跑完之后點(diǎn)的順序是逆時(shí)針的,我們考慮區(qū)間dp,dp[ i ][ j ]表示,從頂點(diǎn) i 沿多邊形的邊逆時(shí)針跑到

頂點(diǎn) j 所形成的折線和 直線i->j,所圍成的多邊形分割成小三角形所需要的花費(fèi)。

狀態(tài)轉(zhuǎn)移方程: dp[ i ][ j ]=min(dp[ i ][ j ] , dp[ i ][ k ]+dp[ k ][ j ]+cost[ i ][ k ]+cost[ k ][ j ]); 如果j-i<=2 顯然花費(fèi)為0,所以答案微dp[ 0 ][ n-1]。

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=305; 4 const int inf=0x3f3f3f3f; 5 int n,tot,dp[N][N],cost[N][N],mod; 6 struct point 7 { 8 int x,y; 9 point(int _x=0,int _y=0){x=_x; y=_y;} 10 point operator -(const point &rhs)const 11 { 12 return point(x-rhs.x,y-rhs.y); 13 } 14 }p[N],cp[N]; 15 typedef point vec; 16 int cross(const vec &a,const vec &b) 17 { 18 return (a.x*b.y)-(a.y*b.x); 19 } 20 int dis(point a,point b) 21 { 22 return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 23 } 24 bool cmp(const point &a,const point &b) 25 { 26 int z=cross(a-p[0],b-p[0]); 27 if(z>0||(z==0 && dis(p[0],a)<dis(p[0],b))) 28 return 1; 29 else return 0; 30 } 31 void get_cp() 32 { 33 int k=0; tot=0; 34 for(int i=0;i<n;i++) 35 if(p[i].y<p[k].y || p[i].y==p[k].y && p[i].x<p[k].x) k=i; 36 swap(p[0],p[k]); 37 sort(p+1,p+n,cmp); 38 tot=2,cp[0]=p[0];cp[1]=p[1]; 39 for(int i=2;i<n;i++) 40 { 41 while(tot>1 && cross(cp[tot-2]-cp[tot-1],p[i]-cp[tot-1])>0) tot--; 42 cp[tot++]=p[i]; 43 } 44 } 45 void init() 46 { 47 memset(dp,-1,sizeof(dp)); 48 memset(cost,0,sizeof(cost)); 49 } 50 int solve(int l,int r) 51 { 52 if(dp[l][r]!=-1) return dp[l][r]; 53 if(r-l<=2) return 0; 54 dp[l][r]=inf; 55 for(int k=l+1;k<=r-1;k++) 56 dp[l][r]=min(solve(l,k)+solve(k,r)+cost[l][k]+cost[k][r],dp[l][r]); 57 return dp[l][r]; 58 } 59 int main() 60 { 61 while(scanf("%d%d",&n,&mod)!=EOF) 62 { 63 for(int i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); 64 get_cp(); 65 if(tot<n) 66 { 67 puts("I can't cut."); 68 continue; 69 } 70 init(); 71 for(int i=0;i<n;i++) 72 for(int j=i+2;j<n;j++) 73 cost[i][j]=cost[j][i]=abs(cp[i].x+cp[j].x)*abs(cp[i].y+cp[j].y)%mod; 74 75 printf("%d\n",solve(0,n-1)); 76 } 77 78 return 0; 79 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/CJLHY/p/8351294.html

總結(jié)

以上是生活随笔為你收集整理的ZOJ-3537的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。