码迷,mamicode.com
首页 > 其他好文 > 详细

Topcoder SRM 653 Div1 250

时间:2015-03-17 23:41:55      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:dp

Problem

N个人坐成一排,属于同一个公司的人都坐在一起(挨在一起),但不知道谁属于哪个公司。现在问其中的某些人 他属于哪个公司,他的回答是AiAi=0表示此人未被询问,否则表示他的回答。题目保证一定存在一种分组方案使得属于同一公司的人都坐在一起。现问方案是否唯一?

Limits

TimeLimit(ms):2000

MemoryLimit(MB):256

N,Ai[1,100]

Solution

dp[i]表示从i位置开始往后分组的情况,dp[i]=0表示无法分组,dp[i]=1表示可以分组且唯一,dp[i]=2表示可以分组且不唯一。显然,i:N?1?>0j:i+1?>N?1,此时分A[i]=0A[i]0来dp。具体怎么dp太麻烦,不讲了。

Complexity

TimeComplexity:O(N2)

MemoryComplexity:O(N)

My Code

//Hello. I‘m Peter.
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
#define gsize(a) (int)a.size()
#define clr(a) memset(a,0,sizeof(a))
#define rep(i, a, b) for (int i = a; i < b; i++)
#define dep(i, a, b) for (int i = a; i > b; i--)
#define repin(i, a, b) for (int i = a; i <= b; i++)
#define depin(i, a, b) for (int i = a; i >= b; i--)
#define N 101
int dp[N];
class CountryGroupHard{
public:
    string solve(vector <int> a){
        int len=gsize(a);
        clr(dp);
        depin(i,len-1,0){
            if(!a[i]){
                int p=-1;
                rep(j,i+1,len){
                    if(j==i+1) dp[i]=dp[j];
                    else if(dp[j]) dp[i]=2;
                    if(a[j]) p=j;
                    if(a[j]) break;
                }
                if(p==-1&&i==len-1) dp[i]=1;
                else if(p==-1) dp[i]=2;
                else if(a[p]>=p-i+1){
                    if(i+a[p]>len) continue;
                    bool ok=true;
                    rep(k,i,i+a[p]){
                        if(a[k]&&a[k]!=a[p]) ok=false;
                    }
                    if(!ok) continue;
                    if(i+a[p]==len) dp[i]=1;
                    else if(i+a[p]<len&&dp[i+a[p]]==2) dp[i]=2;
                    else if(i+a[p]<len&&dp[i+a[p]]==1) dp[i]+=1;
                }
            }
            else{//a[i]>0
                if(i+a[i]>len) continue;
                bool ok=true;
                rep(k,i,i+a[i]){
                    if(a[k]&&a[k]!=a[i]) ok=false;
                }
                if(!ok) continue;
                if(i+a[i]==len) dp[i]=1;
                else if(i+a[i]<len) dp[i]=dp[i+a[i]];
            }
        }
        return dp[0]==1?"Sufficient":"Insufficient";
    }
};

Topcoder SRM 653 Div1 250

标签:dp

原文地址:http://blog.csdn.net/uestc_peterpan/article/details/44357001

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!