您的位置:首页 > 其它

SRM 601 DIV1

2014-02-03 15:17 344 查看
A

  枚举x , 然后对于确定的x , 最后总的apple数对应了唯一的orange数,因此问题转化为求apple的取值范围;

  apple的取值范围: max为每个bag取最多的apple , min为每个bag取最小的apple , 容易证明[min,max]是连续的.

  

using namespace std;
#define maxn 510
#define mod 1000000007
class WinterAndShopping {
public:
int getNumber(vector <int>, vector <int>, vector <int>, vector <int>);
};

struct node{
int f,r,g,b;
int end() {
return f+r+g+b;
}
};vector<node> s[maxn];
int dp[maxn][101][101],c[maxn][maxn];

void pretreat(vector<int> f, vector<int> r, vector<int> g, vector<int> b) {
for (int i=0 ; i<(int)f.size() ; i++ ) {
for (int j=f[i] ; j<f[i]+r[i]+g[i]+b[i] ; j++ ) {
s[j].push_back((node){f[i],r[i],g[i],b[i]});
}
}
for (int i=0 ; i<maxn ; i++ ) if (s[i].size()==2) {
if (s[i][0].f>s[i][1].f) swap(s[i][0],s[i][1]);
}
for (int i=0 ; i<maxn ; i++ ) {
c[i][0] = 1;
for (int j=1 ; j<=i ; j++ )
c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod;
}
}

long long getfct(int r,int g,int b) {
long long res = (long long)c[r+g+b][r] * (long long )c[g+b][g] % mod;
//    printf("r:%d g:%d b:%d res:%lld\n",r,g,b,res);
return res;
}

long long dfs(int t,int r,int g) {
if (t==501) {
if (r==0 && g==0) return 1;
else return 0;
}
if (dp[t][r][g]!=-1) return (long long)dp[t][r][g];
else {
long long res = 0;
if (s[t].size()==0) res = dfs(t+1,0,0);
else if (s[t].size()==1) {
if (t+1 == s[t][0].end()) res = dfs(t+1,0,0);
else {
if (r+1<=s[t][0].r) res += dfs(t+1,r+1,g);
if (g+1<=s[t][0].g) res += dfs(t+1,r,g+1);
if (t-s[t][0].f-r-g+1<=s[t][0].b) res += dfs(t+1,r,g);
}
res %= mod;
}
else if (s[t].size()==2) {
node s0 = s[t][0] , s1 = s[t][1];
int b = (t-s0.f-(r+g));
if (s0.end() == s1.end()) {
if (s0.r-r==s1.r && s0.g-g==s1.g && s0.b-b==s1.b) {
res = getfct(s1.r,s1.g,s1.b) * dfs(s1.end(),0,0) % mod;
}
} else if (s0.end() < s1.end()) {
if (s0.r-r<=s1.r && s0.g-g<=s1.g && s0.b-b<=s1.b) {
res = getfct(s0.r-r,s0.g-g,s0.b-b) * dfs(s0.end(),s0.r-r,s0.g-g) % mod;
}
} else if (s0.end() > s1.end()) {
if (s1.r<=s0.r-r && s1.g<=s0.g-g && s1.b<=s0.b-b) {
res = getfct(s1.r,s1.g,s1.b) * dfs(s1.end(),r+s1.r,g+s1.g) % mod;
}
}
}
dp[t][r][g] = (int)res;
return res;
}
}

int WinterAndShopping::getNumber(vector <int> f, vector <int> r, vector <int> g, vector <int> b) {
pretreat(f,r,g,b);
memset(dp,-1,sizeof(dp));
long long ans = dfs(0,0,0);
return (int)ans;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: