ZOJ 3537 Cake 计算几何+区间dp

来源:互联网 发布:淘宝收货延迟多长时间 编辑:程序博客网 时间:2024/05/16 11:15
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3fffffff;struct node{    int x,y;}N[510],ans[510];bool X(node a,node b,node c){    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}double len(node a,node b){    return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));}bool cmp(node a,node b){    int pp = X(N[1],a,b);    if(pp<0)return 0;// 即axb<0 说明a向量在b的逆时针    else if(pp>0)return 1;// 大于零 说明a向量在b的顺时针    else if(pp==0&&len(N[1],b)>len(N[1],a))return 1;    else return 0;}int dp[510][510],cost[510][510];int main(){    int n,p;    while(~scanf("%d%d",&n,&p))    {        for(int i=1;i<=n;i++)scanf("%d%d",&N[i].x,&N[i].y);        for(int i=2;i<=n;i++){            if(N[i].y<N[1].y)                swap(N[i],N[1]);            else if(N[i].y==N[1].y&&N[i].x<N[1].x)                swap(N[i],N[1]);        }        sort(N+2,N+1+n,cmp);        ans[1]=N[1];        ans[2]=N[2];        int tot=2;        for(int i=3;i<=n;i++){            while(tot>1&&X(ans[tot-1],ans[tot],N[i])<=0)tot--;            tot++;            ans[tot]=N[i];        }        if(tot!=n)puts("I can't cut.");        else{            if(n==3)puts("0");            else{                for(int i=1;i<=n;i++){                    for(int j=1;j<=n;j++){                        if(i==j||abs(i-j)==1)dp[i][j]=0;                        else dp[i][j]=inf;                        cost[i][j]=abs(ans[i].x-ans[j].x)*abs(ans[i].y-ans[j].y)%p;                    }                }                //dp[1][n]=dp[n][1]=0;// 1                for(int l=2;l<=n;l++){                    for(int i=1;i<=n-l+1;i++){                        int j=i+l-1;                        for(int k=i+1;k<=j;k++){                            dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+cost[i][k] + cost[k][j]);                        }                    }                }                printf("%d\n",dp[1][n]);            }        }    }    return 0;}

不知道为什么segment fault啊 感觉数组没问题啊~

原创粉丝点击