SRM 250 #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <string> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <algorithm> using namespace std; class FoxPlayingGame { public: double theMax(int nA, int nB, int paramA, int paramB) { double pa=paramA/1000.0; double pb=paramB/1000.0; if(nB==0) return pa*nA; if(nA==0) return 0.0; if(paramA==0) return 0; double sum=pa*nA; int i; if(paramA>0){ if(paramB==0) return sum; if(paramB>0&¶mB<1000) return sum; if(paramB==1000) return sum; if(paramB>1000){ for(i=1;i<=nB;i++) sum*=pb; return sum; } if(paramB<0&¶mB>-1000) return sum; if(paramB==-1000) return sum; if(paramB<-1000){ if(nB&1) nB--; for(i=1;i<=nB;i++) sum*=pb; return sum; } } else{ if(paramB==0) return 0.0; if(paramB>0&¶mB<1000){ for(i=1;i<=nB;i++) sum*=pb; return sum; } if(paramB==1000) return sum; if(paramB>1000) return sum; if(paramB<0&¶mB>-1000) return sum*pb; if(paramB==-1000) return sum*pb; if(paramB<-1000){ if((nB&1)==0) nB--; for(i=1;i<=nB;i++) sum*=pb; return sum; } } } }; SRM 500, DP #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <string> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <algorithm> using namespace std; #define MOD (1000000007) #define MAXN 43 int dp[MAXN*MAXN][MAXN][2]; int dpt[MAXN*MAXN][MAXN][2]; class FoxAverageSequence { public: int theCount(vector <int> seq) { int n=seq.size(); int ret=0; int i,j; memset(dp,0,sizeof(dp)); if(seq[0]==-1){ for(i=0;i<=40;i++) dp[i][i][0]=1; } else{ dp[seq[0]][seq[0]][0]=1; } int c,k,p,t; for(c=1;c<n;c++){ memset(dpt,0,sizeof(dpt)); if(seq[c]==-1){ for(i=0;i<=40*c;i++) for(t=0;t<=40;t++) for(j=0;j<=40;j++) for(k=0;k<2;k++) if(t*c<=i) if(k==0||t>=j){ dpt[i+t][t][j>t]=(dpt[i+t][t][j>t]+dp[i][j][k])%MOD; } } else{ for(i=0;i<=40*c;i++) for(j=0;j<=40;j++) for(k=0;k<2;k++) if(seq[c]*c<=i) if(k==0||seq[c]>=j){ dpt[i+seq[c]][seq[c]][j>seq[c]]=(dpt[i+seq[c]][seq[c]][j>seq[c]]+dp[i][j][k])%MOD; } } memcpy(dp,dpt,sizeof(dpt)); } for(i=0;i<=n*40;i++) for(j=0;j<=40;j++) for(k=0;k<2;k++){ ret=(ret+dp[i][j][k])%MOD; } return ret%MOD; } };