TC SRM 573 DIV 2
终于在第4场TC,止住了rating一直下降的势头。。。
第一题水题,忘了。。。240+
第二题贪心,没注意结果和n/3比较,差点挂了,看第3个题没有思路,检查一下第二个题发现我少考虑这种情况了。。。悲剧啊,第二个题,没怎么有分了。。
涨了30分。。
第三个题,强哥说是DP,我写了个暴力4维DP,用滚动数组防止MLE,中间一直越界,导致最后一组数据过不了。。虎哥提示精度。。我改改了。。终于过了。效率不高,太暴力了。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <iostream> 5 #include <string> 6 #include <ctime> 7 #include <queue> 8 #include <vector> 9 #include <algorithm> 10 using namespace std; 11 #define MOD 1000000007 12 #define LL long long 13 vector<int>::iterator it; 14 int r[51],c[51]; 15 int dp1[51][151][51]; 16 int dp2[51][151][151]; 17 class WolfPackDivTwo 18 { 19 public: 20 int calc(vector <int> x, vector <int> y, int m) 21 { 22 int i,j,k,n,v,u; 23 int ans = 0,temp; 24 int a[4] = {0,0,-1,1}; 25 int b[4] = {1,-1,0,0}; 26 for(it = x.begin(),i = 0; it != x.end(); it ++,i ++) 27 { 28 r[i] = (*it); 29 } 30 n = i; 31 for(it = y.begin(),i = 0; it != y.end(); it ++,i ++) 32 { 33 c[i] = (*it); 34 } 35 for(i = 0; i < n; i ++) 36 { 37 dp1[i][r[i]+50][c[i]+50] = 1; 38 for(j = 1; j <= m; j ++) 39 { 40 for(k = 0; k <= 150; k ++) 41 { 42 for(u = 0; u <= 150; u ++) 43 { 44 for(v = 0; v < 4; v ++) 45 { 46 if(k+a[v]>=0&&k+a[v]<=150&&u+b[v]>=0&&u+b[v]<=150) 47 dp2[i][k][u] = ((LL)(dp2[i][k][u]+dp1[i][k+a[v]][u+b[v]]))%MOD; 48 } 49 } 50 } 51 for(k = 0;k <= 150;k ++) 52 { 53 for(u = 0;u <= 150;u ++) 54 { 55 dp1[i][k][u] = dp2[i][k][u]; 56 dp2[i][k][u] = 0; 57 } 58 } 59 } 60 } 61 for(j = 0; j <= 150; j ++) 62 { 63 for(k = 0; k <= 150; k ++) 64 { 65 temp = 1; 66 for(i = 0;i < n;i ++) 67 { 68 temp = ((LL)(temp*dp1[i][j][k]))%MOD; 69 } 70 ans = (ans + temp)%MOD; 71 } 72 } 73 return ans; 74 } 75 };

浙公网安备 33010602011771号