題意:給定n個點的座標,先問這些點是否能組成乙個凸包,如果是凸包,問用不相交的線來切這個凸包使得凸包只由三角形組成,根據costi, j = |xi + xj| * |yi + yj| % p算切線的費用,問最少的切割費用。
題解:點我
2015-07-20:專題複習
**稍微修改了一下,順便發現題號寫錯了
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8view codeusing
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 }
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
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 路徑輸出用到...