【Leetcode 907 907. 子数组的最小值之和】【单调栈dp】

import java.util.LinkedList;

class Solution {
    public int sumSubarrayMins(int[] arr) {
        int n = arr.length;
        int[] dp = new int[n];
        dp[0] = arr[0];
        LinkedList<Integer> stack = new LinkedList<>();
        stack.addLast(0);
        int ans  = dp[0];
        for (int i = 1; i < n; i++) {
            while (!stack.isEmpty() && arr[stack.getLast()] >= arr[i]) {
                stack.pollLast();
            }
            int k = stack.isEmpty()?(i+1):(i - stack.getLast());
            dp[i] = (k == (i+1))?k*arr[i]:(dp[i-k]+k*arr[i]);
            ans += dp[i];
            stack.addLast(i);
            ans = ans % (1000000007);
        }
        return ans;
    }
}

 

posted @ 2022-10-28 14:55  fishcanfly  阅读(20)  评论(0)    收藏  举报
//雪花飘落效果