leetcode 133雙周賽 統計逆序對的數目「dp」「前綴和優化」

3193. 統計逆序對的數目

題目描述:

給定一個長度為n的二維數組 r e re re,其中 r e [ i ] = [ i d i , c n t i ] re[i] = [id_i, cnt_i] re[i]=[idi?,cnti?],求存在多少個全排列perm滿足對所有的 r e [ i ] re[i] re[i]都有 p e r m [ 0.. i d i ] perm[0..id_i] perm[0..idi?]恰好有 c n t i cnt_i cnti?個逆序對

答案對1000000007取模

  • 2 <= n <= 300
  • 1 <= requirements.length <= n
  • requirements[i] = [endi, cnti]
  • 0 <= endi <= n - 1
  • 0 <= cnti <= 400
  • 輸入保證至少有一個 i 滿足 endi == n - 1
  • 輸入保證所有的 endi 互不相同。

思路:

首先觀察題目類型是求全排列的數量,還要取模,大概率是dp

再看數據范圍 n=300,m=400,dp的狀態方程完全可以放的下二維的

所以我們考慮用 d p [ i ] [ j ] dp[i][j] dp[i][j]表示滿足所有 i d < = i id<=i id<=i的re下,前i個數字 逆序對數量是j 的全排列數量

求解普通逆序對時,我們可以掃一遍數組,對于每個 a r [ i ] ar[i] ar[i],求出 j < i j<i j<i a r [ j ] > a r [ i ] ar[j]>ar[i] ar[j]>ar[i]的數量并求和

在本題,我們也考慮用這種方式來進行狀態的轉移

對于 i i i,我們只在乎 a r [ i ] ar[i] ar[i] a r [ 1 ] ? a r [ i ] ar[1]-ar[i] ar[1]?ar[i]中的大小關系,如果 a r [ i ] ar[i] ar[i]在這 i i i個數中排最大,也就是排第 i i i位,則不會產生新的逆序對,即 i ? i = 0 i - i = 0 i?i=0,如果排最小,也就是排第1位,則會產生 i ? 1 i-1 i?1個逆序對,如果排第 k k k大,則會產生 i ? k i-k i?k個新的逆序對

所以,我們可以枚舉 a r [ i ] ar[i] ar[i] a r [ 1 ] ? a r [ i ] ar[1]-ar[i] ar[1]?ar[i]排第幾來進行狀態轉移

對于狀態為 d p [ i ] [ j ] dp[i][j] dp[i][j],存在兩種情況,一種是i-1層是沒有限制的,另一種是i-1層是有固定值限制的

  • 如果 i ? 1 i-1 i?1處沒有題目給定的逆序對數量限制,則枚舉k,從0枚舉到 m i n ( i , j ) min(i, j) min(i,j) m i n ( i , j ) min(i, j) min(i,j)是因為對于下標從0開始,到 i ? 1 i-1 i?1的數組,長度為i,此時在末尾添加一個元素,逆序對一次最多只能產生 i i i

    d p [ i ] [ j ] = ∑ k = 0 m i n ( i , j ) d p [ i ? 1 ] [ j ? k ] dp[i][j] = \sum_{k=0}^{min(i,j)}dp[i-1][j-k] dp[i][j]=k=0min(i,j)?dp[i?1][j?k]

  • 如果 i ? 1 i-1 i?1處存在題目給定的逆序對數量限制,那只能從那一個狀態轉移過來,假設r代表則re中對應位置的cnt, 則 d p [ i ] [ j ] = d p [ i ? 1 ] [ r ] dp[i][j] = dp[i - 1][r] dp[i][j]=dp[i?1][r] r < = j < = r + i r<=j<=r+i r<=j<=r+i

class Solution {const int mod = 1000000007;
public:int numberOfPermutations(int n, vector<vector<int>>& re) {vector<int>p(n, -1);for(auto x : re){p[x[0]] = x[1];}int m = p[n - 1];vector<vector<int>> dp(n, vector<int>(m + 1));dp[0][0] = 1;for(int i = 1; i < n; ++i){if(p[i - 1] == -1){//無限制for(int j = 0; j <= m; ++j){for(int k = 0; k <= min(i, j); ++k){dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;}}}else{//有限制for(int j = p[i - 1]; j <= min(m, p[i - 1] + i); ++j){dp[i][j] = dp[i - 1][p[i - 1]];}}}return dp[n - 1][p[n - 1]];}
};

也可以用記憶化搜索實現:

class Solution {const int mod = 1000000007;
public:int numberOfPermutations(int n, vector<vector<int>>& re) {vector<int>p(n, -1);p[0] = 0;for(auto x : re){p[x[0]] = x[1];}if(p[0])return 0;int m = p[n - 1];vector<vector<int>> dp(n, vector<int>(m + 1, -1));auto dfs = [&] (auto&& dfs, int i, int j){if(i == 0){return 1;} if(dp[i][j] != -1)return dp[i][j];int & sum = dp[i][j];sum = 0;if(p[i - 1] == -1){for(int k = 0; k <= min(i, j); ++k){sum = (sum + dfs(dfs, i - 1, j - k)) % mod;}}else {if(j >= p[i - 1] && j <= i + p[i - 1]){sum = dfs(dfs, i - 1, p[i - 1]);}}return sum;};return dfs(dfs, n - 1, p[n - 1]);}
};

這樣寫的時間復雜度是O(n * m * min(n, m)),空間復雜度是O(n * m)

優化

我們可以發現對于無限制的那段 d p [ i ] [ j ] dp[i][j] dp[i][j]是一個連續的區間加法,可以用前綴和來優化枚舉k的過程,要注意下標寫對了

甚至還可以用滾動數組把空間降下來,這里懶得寫了

class Solution {const int mod = 1000000007;
public:int numberOfPermutations(int n, vector<vector<int>>& re) {vector<int>p(n, -1);for(auto x : re){p[x[0]] = x[1];}int m = p[n - 1];vector<vector<int>> dp(n, vector<int>(m + 1, 0));dp[0][0] = 1;for(int i = 1; i < n; ++i){int mx = p[i] == -1 ? m : p[i];if(p[i - 1] == -1){//無限制vector<int>pre(m+1, 0);pre[0] = dp[i - 1][0];for(int j = 1; j <= m; ++j)pre[j] = (pre[j - 1] + dp[i - 1][j])%mod;for(int j = 0; j <= mx; ++j){dp[i][j] = (pre[j] - (j - min(i, j) == 0 ? 0 : pre[j - min(i, j) - 1]) + mod) % mod;}}else{//有限制for(int j = p[i - 1]; j <= min(mx, p[i - 1] + i); ++j){dp[i][j] = dp[i - 1][p[i - 1]];}}}return dp[n - 1][p[n - 1]];}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37663.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bayes分類器設計

本篇文章是博主在人工智能等領域學習時&#xff0c;用于個人學習、研究或者欣賞使用&#xff0c;并基于博主對人工智能等領域的一些理解而記錄的學習摘錄和筆記&#xff0c;若有不當和侵權之處&#xff0c;指出后將會立即改正&#xff0c;還望諒解。文章分類在AI學習筆記&#…

東方博宜 OJ 1201-1300

目錄 1268&#xff1a;【基礎】高精度加法 1269&#xff1a;【基礎】高精度減法 1280&#xff1a;【基礎】求 2 的 n 次方 1281&#xff1a;【基礎】求 222222?222?2 1285:【基礎】計算 N 的階乘 1286&#xff1a;【基礎】高精度乘單精度 1287&#xff1a;【基礎】高精…

第一百三十三節 Java數據類型教程 - Java基本數據類型

Java數據類型教程 - Java基本數據類型 Java定義了八種基本類型的數據:byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;char&#xff0c;float&#xff0c;double和boolean。 基本類型通常被稱為簡單類型。 這些可以分為四組: Integers - 包括byte&#x…

求推薦幾款http可視化調試工具?

Postman 非常流行的API調試工具&#xff0c;適用于構建、測試和文檔化APIs。它支持各種HTTP方法&#xff0c;有強大的集合和環境管理功能&#xff0c;以及代碼生成能力。 BB-API 是一款旨在提升開發效率的工具&#xff0c;它專注于提供簡約、完全免費且功能強大的HTTP模擬請…

目標檢測算法

一、緒論 1.1 目標檢測算法的定義和背景 1.2 目標檢測算法在計算機視覺領域的重要性 二、目標檢測算法的發展歷程 2.1 傳統目標檢測算法 2.2 基于深度學習的目標檢測算法 2.3 目標檢測算法的評價指標 三、目標檢測算法的關鍵技術 3.1 區域建議網絡(RPN) 3.2 卷積神經…

springmvc快速上手

一、創建工程 1、創建maven工程&#xff0c;添加maven-archetype-webapp模版 2、添加依賴 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.co…

每日一題——Python實現PAT乙級1059 C語言競賽(舉一反三+思想解讀+逐步優化)四千字好文

一個認為一切根源都是“自己不夠強”的INTJ 個人主頁&#xff1a;用哲學編程-CSDN博客專欄&#xff1a;每日一題——舉一反三Python編程學習Python內置函數 Python-3.12.0文檔解讀 目錄 我的寫法 時間復雜度分析 空間復雜度分析 代碼優化建議 總結 我要更強 優化方法…

macos Darwin安裝faiss-cpu

文章目錄 macos 使用brew instll fass, 后python3.12執行引用faiss包功能出現的問題 安裝時遇到問題如下 ModuleNotFoundError Traceback (most recent call last) File ~/Src/ai/framework/langchain/.venv/lib/python3.12/site-packages/langchain_co…

Spring事務的實現

Spring事務的實現分為編程式事務和聲明式事務。 編程式事務 編程式事務管理需要開發者在代碼中顯式地調用事務管理相關的方法,如`beginTransaction()`、`commit()`和`rollback()`等。在Spring中,通常通過以下兩種方式來實現編程式事務: 使用`TransactionTemplate`,`Tran…

macOS 安裝redis

安裝Redis在macOS上通常通過Homebrew進行&#xff0c;Homebrew是macOS上一個流行的包管理器。以下是安裝Redis的步驟&#xff1a; 一 使用Homebrew安裝Redis 1、安裝Homebrew&#xff08;如果尚未安裝&#xff09;&#xff1a; 打開終端&#xff08;Terminal&#xff09;并執…

.NET周刊【6月第4期 2024-06-23】

國內文章 C#.Net筑基-集合知識全解 https://www.cnblogs.com/anding/p/18229596 .Net中提供了數組、列表、字典等多種集合類型&#xff0c;分為泛型和非泛型集合。泛型集合具有更好的性能和類型安全性。集合的基礎接口包括IEnumerator、IEnumerable、ICollection、IList、ID…

Gradio 4.37.1官方教程二:Blocks

文章目錄 一、Blocks及事件監聽器1.1 Blocks結構1.2 事件監聽器的類型1.3 多數據流1.4 多輸入組件1.5 多輸出組件1.6 更新組件配置1.7 添加示例1.8 連續運行事件1.9 持續運行事件1.9.1 every參數1.9.2 load方法1.9.3 change方法 1.10 收集事件數據1.11 綁定多個觸發器到同一函數…

基于線調頻小波變換的一維時間序列時頻分析方法(MATLAB)

在機械故障診斷領域,振動信號的處理常采用以快速傅立葉變換為基礎的相關分析、幅值分析、頻譜分析等時域和頻域分析方法。但經典的FFT存在固有缺點,即它雖然在頻域范圍內是完全局部化的,但是它不包含任何時域信息,因而不適于分析非平穩信號。近年來涌現的各種時頻分析方法(短時…

【刷題】初步認識深搜(DFS)

送給大家一句話&#xff1a; 擁有希望的人&#xff0c;和漫天的星星一樣&#xff0c;是永遠不會孤獨的。 -- 《星游記》 初步認識深搜&#xff08;DFS&#xff09; dfs算法二叉樹中的深搜Leetcode 129. 求根節點到葉節點數字之和題目描述算法思路 Leetcode 814. 二叉樹剪枝題…

Redis-實戰篇-緩存更新策略(內存淘汰、超時剔除、主動更新)

文章目錄 1、緩存更新策略1.1、內存淘汰1.2、超時剔除1.3、主動更新 2、業務場景&#xff1a;3、主動更新在企業中業務實現有三種方式3.1、Cache Aside Pattern3.1.1、操作緩存和數據庫時有三個問題需要考慮&#xff1a;3.1.1.1、刪除緩存還是更新緩存&#xff1f;3.1.1.2、如何…

數據同步軟件有哪些

數據同步軟件有哪些呢&#xff1f;隨著企業規模的擴大&#xff0c;企業數據也積累得越來越多&#xff0c;萬一發生宕機風險&#xff0c;那么這個損失將不可估量。所以為了容災備用&#xff0c;我們往往需要將數據同步到另一臺備胎服務器上&#xff0c;進行冗余。 那么需要同步的…

centos7.9 python3環境(virtualenv)搭建及所遇錯誤

人望山&#xff0c;魚窺荷&#xff0c;真正喜歡想要的&#xff0c;沒有一樣可以輕易得到。 目錄 # 1. 解決版本沖突問題--建議不要跳過(一定要查看軟鏈接是否鏈接正確) # 2. python3(virtualenv)環境搭建 # 3. virtualenv常用命令 # 4. 所遇錯誤解析 ## 4.1 遇到 No modul…

惠海 H6246低功耗DC/DC降壓型恒壓芯片60V降3.3V5V12V 藍牙模塊 單片機供電

1.產品描述 H6246是一種內置60V耐壓MOS&#xff0c;支持輸入高達48V的高壓降壓開關控制器&#xff0c;可以向負載提供0.3A的連續電流。H6246支持輸出恒定電壓&#xff0c;可以通過調節VFB采樣電阻來設置輸出電壓&#xff0c;同時支持最大電流限制&#xff0c;可以通過修改CS采…

操作系統期末復習考題二

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文??????三、總結&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

【資源調度】1-何為調度?

導讀&#xff1a;本期是全網最全【資源調度】系列推文的第1期(共50期左右)。我們將對調度的定義與作用、計劃與調度的關系、調度問題的拆解做出詳細介紹&#xff0c;使大家對【資源調度】問題有了一個整體的認識&#xff0c;為后續的內容奠定基礎。 作者1&#xff1a;張哲銘&am…