SRM 601 DIV1
2014-02-03 15:17
344 查看
A
枚举x , 然后对于确定的x , 最后总的apple数对应了唯一的orange数,因此问题转化为求apple的取值范围;
apple的取值范围: max为每个bag取最多的apple , min为每个bag取最小的apple , 容易证明[min,max]是连续的.
View Code
枚举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
相关文章推荐
- TopCoder SRM 601 div2
- srm 303 div2 1000 (简单暴力,分解素因子)
- topcoder srm 585 div1
- topcoder SRM 501 div1 level1
- TopCoder_SRM_144_DIV2_250_Time
- TopCoder SRM 654 Div2 Problem 500 - OneEntrance (思维)
- SRM 492 div1 level 2
- FlipGame(SRM544-div1-2)
- FavouriteDigits(SRM546-div1-2-div2-3)
- srm 592 div 2
- TC SRM 593 DIV1 250(dfs)
- Topcoder SRM 709 DIV 2 250pt Robofactory solution
- [TopCoder] SRM 581 DIV 2, 250p, 500p, 1000p, Solution
- SRM 551 div2
- QuickSums - SRM 197 Div 2 dp+矩阵+暴力
- topcoder srm 430 div1
- Topcoder SRM 596 DIV 1
- topcoder srm 710 div1 -23
- TopCoder SRM 598 Div1 第2题
- Topcoder SRM 146 Div2 1000(dfs搜索,经典过桥问题,很有意思)