Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
266ms渣代妈,某处i和j下标打反了wa了一次qaq这种题最好还是做一些预处理感觉。。。注释里的就是预处理的代妈= = #include <iostream> #include <vector> #include <cmath> #include <stdio.h> using namespace std; int okNum[60] = {0,1,2,4,8,9,16,17,18,32,33,34,36,64,65,66,68,72,73,128,129,130,132,136,137,144,145,146,256,257,258,260,264,265,272,273,274,288,289,290,292,512,513,514,516,520,521,528,529,530,544,545,546,548,576,577,578,580,584,585}; int numOf1[60] = {0,1,1,1,1,2,1,2,2,1,2,2,2,1,2,2,2,2,3,1,2,2,2,2,3,2,3,3,1,2,2,2,2,3,2,3,3,2,3,3,3,1,2,2,2,2,3,2,3,3,2,3,3,3,2,3,3,3,3,4}; int geshu[11] = {0,2,3,4,6,9,13,19,28,41,60}; int main() { /* for(int i = 0; i < 60; i++){ int temp = okNum[i]; int cnt = 0; for(int j = 0; j < 10; j++){ if((temp >> j)%2 == 1) cnt++; } cout << cnt << ","; }*/ int res[102][60][60] = {0}; int N, M; scanf("%d%d", &N, &M); int hills[101] = {0}; for(int i = 0; i < N; i++){ char c[11]; scanf("%s", &c); for(int j = 0; j < M; j++){ //cout << c[j] << " "; if(c[j] == 'H') hills[i] |= (1 << j); } //cout << endl; } /* for(int i = 0; i < N; i++){ cout << hills[i] << " "; } cout << endl;*/ if(N == 1){ int MAX = 0; for(int i = 0; i < geshu[M]; i++){ if((hills[0] & okNum[i]) != 0) continue; if(numOf1[i] > MAX) MAX = numOf1[i]; } cout << MAX << endl; return 0; } //初始值:前两个 for(int i = 0; i < geshu[M]; i++){ for(int j = 0; j < geshu[M]; j++){ if(((okNum[i] & hills[0]) != 0) || ((okNum[j] & hills[1]) != 0) || ((okNum[i] & okNum[j]) != 0)){ res[2][j][i] = -1; continue; } res[2][j][i] = numOf1[i] + numOf1[j]; } } for(int m = 3; m <= N; m++){ int ans = 0; for(int i = 0; i < geshu[M]; i++){ for(int j = 0; j < geshu[M]; j++){ if(((okNum[i] & hills[m-1]) != 0) || ((okNum[j] & hills[m-2]) != 0) || ((okNum[i] & okNum[j]) != 0)){ res[m][i][j] = -1; continue; } int MAX = 0; for(int k = 0; k < geshu[M]; k++){ if((res[m-1][j][k] == -1) || ((okNum[i] & okNum[k]) != 0)) continue; int temp = numOf1[i] + res[m-1][j][k]; if(MAX < temp) MAX = temp; } res[m][i][j] = MAX; if(m == N){ if(ans < MAX) ans = MAX; } } } if(m == N){ cout << ans << endl; } } /* int cnt = 0; int res[60]; for(int i = 0; i < 1024; i++){ int ct[10]; vector<int> tmp; for(int j = 0; j <= 9; j++){ ct[j] = (i >> j) & 1; if(ct[j]) tmp.push_back(j); } bool can = true; if(tmp.size() <= 1) goto wanle; for(int j = 0; j < tmp.size() - 1; j++){ if(tmp[j+1] - tmp[j] <= 2){ can = false; break; } } wanle: if(can){ cout << i << ","; res[cnt] = i; cnt++; } } cout << endl << cnt << endl; int mi = 1; int jl[10]; for(int i = 0; i < 60; i++){ if(res[i] > pow(2, mi)-1){ jl[mi] = i; mi++; } } for(int i = 0; i <= 9; i++) cout << jl[i] << " ";*/ return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator