[Atcoder - Distinct Trio ] 动态规划
记f[i][j] 为前i个元素能构成的j个不同元素对的个数。对于题目j<=3;这样就有转移方程。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] words = br.readLine().split("\\s+"); int n = Integer.valueOf(words[0]); long[][] f = new long[n][4]; int[] A = new int[n]; Map<Integer,Integer> map = new HashMap<>(); words = br.readLine().split("\\s+"); for(int i = 0;i<words.length;i++){ A[i] = Integer.valueOf(words[i]); int times = map.getOrDefault(A[i],0); map.put(A[i],times+1); if( i == 0){ f[0][1] = 1; f[0][2] = 0; f[0][3] = 0; }else{ if( times > 0) { f[i][1] = f[i-1][1]; f[i][2] = f[i-1][2] + (i - times); f[i][3] = f[i-1][3] + f[i-1][2] - times*(i - times); }else{ f[i][1] = f[i-1][1] + 1; f[i][2] = f[i-1][2] + i ; f[i][3] = f[i-1][3] + f[i-1][2]; } } } System.out.println(f[n-1][3]); } }

浙公网安备 33010602011771号