zoj 3537 區間dp 計算幾何

2022-06-02 13:45:07 字數 3979 閱讀 7274

題意:給定n個點的座標,先問這些點是否能組成乙個凸包,如果是凸包,問用不相交的線來切這個凸包使得凸包只由三角形組成,根據costi, j = |xi + xj| * |yi + yj| % p算切線的費用,問最少的切割費用。

題解:點我

2015-07-20:專題複習

**稍微修改了一下,順便發現題號寫錯了

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10const

int inf=0x3f3f3f3f;11

const

double eps=1e-5

;12 typedef long

long

ll;13

#define cl(a) memset(a,0,sizeof(a))

14#define ts printf("*****\n");

15const

int maxn=310;16

intn,m;

17int sgn(double

x)18

23struct

point

2427 point(double _x,double

_y)28

31 point operator -(const point &b)const

3235

//叉積

36double

operator ^(const point &b)const

3740

//點積

41double

operator *(const point &b)const

4245

//繞原點旋轉角度b(弧度值),後x,y的變化

46};

47point list[maxn];

48int

stack[maxn],top;

49double

dist(point a,point b)

5053

//相對於list[0]的極角排序

54bool

_cmp(point p1,point p2)

5562

void graham(int

n)6375}

76 swap(list[k],list[0

]);77 sort(list+1,list+n,_cmp);

78if(n==1)79

84if(n==2)85

91 stack[0]=0

;92 stack[1]=1

;93 top=2;94

for(int i=2;i < n;i++)

95100

}101

intcost[maxn][maxn];

102int dis(point p1,point p2)//

計算題目定義的cost

103106

intdp[maxn][maxn];

107int

main()

108119

graham(n);

120if(top!=n)

121125

cl(cost);

126for(i=0;i)

127for(j=i+2;j)

128 cost[i][j]=cost[j][i]=dis(list[i],list[j]);

129for(i=0;i)

130134

for(int len=2;len)

135143

}144

}145

/*for(i=n-3;i>=0;i--)

146153

}154}*/

155 printf("

%d\n

",dp[0][n-1

]);156

}157 }

view code

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10const

int inf=0x3f3f3f3f;11

const

double eps=1e-5

;12 typedef long

long

ll;13

#define cl(a) memset(a,0,sizeof(a))

14#define ts printf("*****\n");

15const

int maxn=310;16

intn,m;

17int sgn(double

x)18

23struct

point

2427 point(double _x,double

_y)28

31 point operator -(const point &b)const

3235

//叉積

36double

operator ^(const point &b)const

3740

//點積

41double

operator *(const point &b)const

4245

//繞原點旋轉角度b(弧度值),後x,y的變化

46};

47point list[maxn];

48int

stack[maxn],top;

49double

dist(point a,point b)

5053

//相對於list[0]的極角排序

54bool

_cmp(point p1,point p2)

5562

void graham(int

n)6375}

76 swap(list[k],list[0

]);77 sort(list+1,list+n,_cmp);

78if(n==1)79

84if(n==2)85

91 stack[0]=0

;92 stack[1]=1

;93 top=2;94

for(int i=2;i < n;i++)

95100

}101

intcost[maxn][maxn];

102int dis(point p1,point p2)//

計算題目定義的cost

103106

intdp[maxn][maxn];

107int

main()

108119

graham(n);

120if(top!=n)

121125

cl(cost);

126for(i=0;i)

127for(j=i+2;j)

128 cost[i][j]=cost[j][i]=dis(list[i],list[j]);

129for(i=0;i)

130134

for(i=n-3;i>=0;i--)

135142

}143

}144 printf("

%d\n

",dp[0][n-1

]);145

}146 }

ZOJ 3537 簡單凸包 DP

簡單學習了凸包,基本照著 抄 凸包好像就是排序後跑乙個polygon函式,就能得到乙個凸包了 原理的話用平面直角座標系的斜率理解 凸包之後,圖上的點被排序成順時針排列的點 此時就是區間dp的思路了 include include include include include include inc...

zoj3541 區間dp求方案

題目鏈結 先吐槽一下hdu的spj,死都過不了,uva和zoj上都能過。題意就是一排上有很多燈,給你每個燈按下去後能亮的時間和座標 人每秒走一格 首先發現列舉起點做不了,所以要列舉終點。這裡有乙個很有用的結論,就是每個燈我只關心最後一次路過的時間,而從某個點一直按到結束的合法方案中,我們要麼直接走到...

zoj1276 區間dp 路徑輸出

題意 矩陣連乘,找到最小次數,同時輸出括號的巢狀方式 分析 經典的區間dp,並且記錄下了dp的path 因為是遞迴得到的path,所以遞迴壓棧按從裡到外的順序得到path就可以了 輸出巢狀括號部分很好的考察了對棧的理解,和遞迴執行的順序。注意題目輸出中有的地方有空格。1 zoj1276 路徑輸出用到...