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 };

 

posted @ 2013-03-15 16:10  Naix_x  阅读(243)  评论(0)    收藏  举报