特徵提取-map

欣宇I發表於2021-01-04

小明是一名演算法工程師,同時也是一名鏟屎官。某天,他突發奇想,想從貓咪的視訊裡挖掘一些貓咪的運動資訊。為了提取運動資訊,他需要從視訊的每一幀提取“貓咪特徵”。一個貓咪特徵是一個兩維的vector<x, y>。如果x_1=x_2 and y_1=y_2,那麼這倆是同一個特徵。

       因此,如果喵咪特徵連續一致,可以認為喵咪在運動。也就是說,如果特徵<a, b>在持續幀裡出現,那麼它將構成特徵運動。比如,特徵<a, b>在第2/3/4/7/8幀出現,那麼該特徵將形成兩個特徵運動2-3-4 和7-8。

現在,給定每一幀的特徵,特徵的數量可能不一樣。小明期望能找到最長的特徵運動。

 

輸入描述:

第一行包含一個正整數N,代表測試用例的個數。

每個測試用例的第一行包含一個正整數M,代表視訊的幀數。

接下來的M行,每行代表一幀。其中,第一個數字是該幀的特徵個數,接下來的數字是在特徵的取值;比如樣例輸入第三行裡,2代表該幀有兩個貓咪特徵,<1,1>和<2,2>
所有用例的輸入特徵總數和<100000

N滿足1≤N≤100000,M滿足1≤M≤10000,一幀的特徵個數滿足 ≤ 10000。
特徵取值均為非負整數。

 

輸入例子1:

1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1

 

輸出例子1:

3

 



import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	
		int n = sc.nextInt();
		
		sc.nextLine();
        
        // 每個測試用例
		for (int i = 0; i < n; i++) {
			calcEachTestExample(sc);
		}
	}

	private static void calcEachTestExample(Scanner sc) {
		
		// 幀數
		int m = sc.nextInt();
		
		sc.nextLine();
		
		int maxCount = 0;
		ArrayList<HashMap<Features, Integer>> rowList = new ArrayList<HashMap<Features, Integer>>();
		for (int i = 0; i < m; i++) {
			
			int rowNum = sc.nextInt();
			
			HashMap<Features, Integer> map = new HashMap<Features, Integer>();
			for (int j = 0; j < 2 * rowNum - 1; j = j + 2) {
				Features fd = new Features(sc.nextInt(), sc.nextInt());
				
				int fdcount = 1;
				// 最大特徵數是上層最大加1
				if (rowList.size() > 0 && rowList.get(i - 1).containsKey(fd)) {
					fdcount = rowList.get(i - 1).get(fd) + 1;
				}
				
				map.put(fd, fdcount);
				
				maxCount = Math.max(maxCount, fdcount);
			}
			
			rowList.add(map);
			sc.nextLine();
		}
		
		System.out.println(maxCount);
	}
	
	public static class Features {
		int x;
		int y;
		
		public Features(int a, int b) {
			x = a;
			y = b;
		}
		
		@Override
		public boolean equals(Object o) {
			if (o instanceof Features) {
				return x == ((Features)o).x && y == ((Features)o).y;
			}
			return false;
		}
		
		@Override
		public int hashCode() {
			return Integer.hashCode(x & y);
		}
	}
}

 

相關文章