SRM574 Div1Medium PolygonTraversal

3662 단어 TCdp
[분석] 제목의 범위를 보았을 때 나는 이것이 틀림없이 상압 dp라고 생각했다. 이것은 틀림없이 dp[i][j]를 정의한 것이고 이때 i에서 얻은 점의 집합은 j라고 했다.그러면 문제가 왔습니다. 이런 점들이 있습니다. 제가 i에서 j의 보집 점까지 어떻게 판단할 수 있을까요?이어서 나는 종이 위에 그림을 그렸다.마지막으로 나는 x가 y를 원한다면 원 위의 x가 시계 반대 방향으로 y를 가리키거나 x가 시계 반대 방향으로 y를 가리키면 반드시 약간은 있어야 한다는 것을 발견했다.(왜인지는 내가 어떻게 알고 실천하면 진지해진다).그러면 문제가 해결됩니다!
【코드】
#include 
using namespace std;
#define M 18
#define ll long long
ll dp[M][1<bool mk[M];
int a[M];
int hav;
int n,m;
bool chk(int now,int to,int si){
    int cur;
    bool l=0,r=0;
    cur=(to+1)%n;//         ,  now to         ,to       now,      ,          。
    while(cur!=now){
        if(mk[cur]||si&(1<1;
            break;
        }
        else cur=(cur+1)%n;
    }
    cur=(now+1)%n;
    while(cur!=to){
        if(mk[cur]||si&(1<1;
            break;
        }
        else cur=(cur+1)%n;
    }
    return l&&r;
}
ll DP(int p,int si,int cnt){
    ll &res=dp[p][si];
    if(res)return res;
    if(cnt==n)return res=chk(p,a[1],si);
    res=0;
    for(int i=0;iif(i==p||mk[i]||(si&(1<continue;
        if(chk(p,i,si))res+=DP(i,si|(1<1);
    }
    return res;
}
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&a[i]);
        a[i]--;
        mk[a[i]]=1;
        hav+=(1<cout<return 0;
}

좋은 웹페이지 즐겨찾기