[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]);
    }

}

 

posted @ 2022-05-22 10:18  fishcanfly  阅读(44)  评论(0)    收藏  举报
//雪花飘落效果