Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

树状dp 5548K 157ms 这效率还可以啊!

Posted by KatrineYang at 2016-09-25 08:55:08 on Problem 1383 and last updated at 2016-09-25 08:55:50
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int m,n;
bool used[1022][1022];
bool kong[1022][1022];
int rootX, rootY;
int mx;

inline int MX(int a, int b){
	return (a>b) ? a : b;
}

int getDepthMax(int x, int y){
	used[x][y] = 1;
	int depth[4];
	int cnt = 0;
	int retVal = 0;
	if(kong[x-1][y] && !used[x-1][y]){
		depth[cnt] = getDepthMax(x-1,y);
		retVal = MX(retVal, depth[cnt]+1);
		cnt++;
	}
	if(kong[x+1][y] && !used[x+1][y]){
		depth[cnt] = getDepthMax(x+1,y);
		retVal = MX(retVal, depth[cnt]+1);
		cnt++;
	}
	if(kong[x][y-1] && !used[x][y-1]){
		depth[cnt] = getDepthMax(x,y-1);
		retVal = MX(retVal, depth[cnt]+1);
		cnt++;
	}
	if(kong[x][y+1] && !used[x][y+1]){
		depth[cnt] = getDepthMax(x,y+1);
		retVal = MX(retVal, depth[cnt]+1);
		cnt++;
	}
	if(cnt == 0){;}
	else if(cnt == 1){
		mx = MX(mx, retVal);
	}
	else if(cnt == 2){
		mx = MX(mx, depth[0]+depth[1]+2);
	}
	else{
		sort(depth, depth+cnt);
		mx = MX(mx, depth[cnt-1] + depth[cnt-2] + 2);
	}
	return retVal;
}

int main(int argc, char **argv) {
	int t;
	scanf("%d", &t);
	for(int ii = 0; ii < t; ii++){
		bool getRoot = 0;
		mx = 0;
		scanf("%d%d", &n, &m);
		char str[1022];
		for(int i = 1; i <= m; i++){
			scanf("%s", str);
			for(int j = 1; j <= n; j++){
				if(str[j-1]=='.') {
					kong[i][j] = 1;
					if(!getRoot){
						rootX = i, rootY = j;
						getRoot = 1;
					}
				}
				else kong[i][j] = 0;
			}
		}
		for(int j = 0; j <= n+1; j++) {
			kong[0][j] = 0, kong[m+1][j] = 0;
		}
		for(int i = 0; i <= m+1; i++){
			kong[i][0] = 0, kong[i][n+1] = 0;
		}
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				used[i][j] = 0;
			}
		}
		getDepthMax(rootX, rootY);
		printf("Maximum rope length is %d.\n", mx);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator