3250. 单调数组对的数目 I

45 阅读1分钟

链接:leetcode.cn/problems/fi…

思路

dp[i][j]代表arr1前i个数以值j结尾的单调数组对数目,然后枚举第i-1个数的值0-j(dp[i-1][k]),判断是否合法,如果合法就dp[i][j]+=dp[i-1][k]

代码实现

class Solution {
public:
    int countOfPairs(vector<int>& nums) {
        int mod=1e9+7;
        int n=nums.size();
        //记得开long long
        vector<vector<long long>>dp(n,vector<long long>(51,0));
        //初始化
        for(int i=0;i<=nums[0];i++){
            dp[0][i]=1;
        }

        for(int i=1;i<n;i++){
            for(int j=0;j<=nums[i];j++){
                for(int k=0;k<=j;k++){
                    //判断是否合法
                    if(j>=k&&nums[i]-j<=nums[i-1]-k){
                        dp[i][j]+=dp[i-1][k]%mod;
                    }
                    
                }
                
            }
        }
        
        //累加即是答案
        long long ans=0;
        for(int i=0;i<=nums[n-1];i++){
            ans+=dp[n-1][i];
        }
        return ans%mod;
    }
};