转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
class WolfPackDivTwo { public: LL c[55][55]; void Init(){ for(int i=0;i<=50;i++){ c[i][0]=c[i][i]=1; for(int j=1;j<i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD; } } LL check(vi x,vi y,int cx,int cy,int m){ LL ans=1; for(int i=0;i<x.size();i++){ int a=abs(x[i]-cx)+abs(y[i]-cy); if(a>m || (m-a)&1) return 0; int up=0,down=0,left=0,right=0; int k=m-a; if(x[i]>cx) left=x[i]-cx; else right=cx-x[i]; if(y[i]>cy) up=y[i]-cy; else up=cy-y[i]; LL t=0; for(int j=0;j*2<=k;j++){ int l=left+j; int r=right+j; int u=up+(k-2*j)/2; int d=down+(k-2*j)/2; t=((((c[m][l]*c[m-l][r])%MOD)*c[m-l-r][u]%MOD)+t)%MOD; } ans=((LL)ans*t)%MOD; } return ans; } int calc(vector <int> x, vector <int> y, int m) { LL ans=0; Init(); for(int i=-51;i<=151;i++){ for(int j=-51;j<=151;j++){ ans=(ans+check(x,y,i,j,m))%MOD; } } return ans; } }
class SkiResorts { public: long long minCost(vector <string> r, vector <int> h) { int n=h.size(); int w[n]; LL dp[n][n]; for(int i=0;i<n;i++) w[i]=h[i]; sort(w,w+n); bool in[n];mem(in,false); mem(dp,-1); for(int i=0;i<n;i++) dp[0][i]=abs(h[0]-w[i]); queue<int>que; que.push(0); in[0]=true; while(!que.empty()){ int u=que.front(); que.pop(); in[u]=false; for(int i=0;i<n;i++){ if(r[u][i]=='N') continue; for(int j=0;j<n;j++){ for(int k=0;k<=j;k++){ if(dp[i][k]==-1||dp[i][k]>dp[u][j]+abs(h[i]-w[k])){ dp[i][k]=dp[u][j]+abs(h[i]-w[k]); if(in[i]==false){ in[i]=true; que.push(i); } } } } } } LL ans=-1; for(int i=0;i<n;i++) if(dp[n-1][i]!=-1){ if(ans==-1||dp[n-1][i]<ans) ans=dp[n-1][i]; } return ans; } }