leetcode 第133場雙周賽 100333.統計逆序對的數目【計數dp/滾動數組/前綴和優化】

在這里插入圖片描述
分析:
先考慮如下問題。

求長度為n,逆序對為m的排列數量。

可以考慮dpdp[i][j]定義為長度為i,逆序對為j的排列數量。

dp[1][0] = 1;
//枚舉排列長度,或者認為枚舉當前需要插到長度為i-1的排列中的數字
for(int i = 1; i <= n; ++i)  
{for(int j = 0; j <= i * (i + 1) / 2; ++j){//枚舉當前數字插到的位置,一共i個位置,分別可能使逆序對增加0~i-1個for(int k = 0; k < i; ++k){if(j >= k){dp[i][j] += dp[i - 1][j - k];}}}
}

在懂了上述dp之后,再來考慮本題。主要有兩個問題。

  • 另外考慮,如果dp[i][j]是否依舊可以這樣求,因為上述問題中對于長度為i的排列,前i-1個數字確定的,i一定是最大的,我們只需要考慮它放在哪個位置即可。
  • 如何同時滿足requirements[i][endi] = cntirequirements[j][endj] = cntj,其中i!=j

對于第一點,肯定是可以這樣求的,一方面我們不需要關心前i-1個數字是什么,只需要認為我們枚舉的第i個數字是這i個數字中最大的(類似上述思路)或者是最小的(與最大的等效并且更加方便理解上述dp的最內層循環)即可,另一方面我們看到至少有一個i滿足endi == n - 1

對于第二點,我們只需要在dp的過程中適當修改。若 ? e n d j = = i \exists end_j == i ?endj?==i,則正常求 d p [ i ] [ c n t j ] dp[i][cnt_j] dp[i][cntj?]的值,而 d p [ i ] [ k ] = 0 , k ≠ c n t j dp[i][k]=0,k\ne cnt_j dp[i][k]=0,k=cntj?

AC代碼

class Solution {
public:int numberOfPermutations(int n, vector<vector<int>>& requirements) {const int mod = 1e9 + 7;vector<int> vt(305, -1);for(auto x: requirements) vt[x[0] + 1] = x[1];vector<vector<int>> dp(305, vector<int>(405, 0));dp[0][0] = 1;for (int i = 1; i <= n; ++i) {if (vt[i] != -1) {int j = vt[i];for (int k = 0; k < i; ++k) if (j >= k) dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;continue;}for (int j = 0; j <= min(400, (1 + i) * i / 2); ++j) {for (int k = 0; k < i; ++k) {if (j >= k) dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;}}}return dp[n][vt[n]];}
};
//dp數組定義為vector,如果定義為數組,一定記得先memset 0
//(dp[i][j] += dp[i - 1][j - k]) % mod不等價于dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;
//(dp[i][j] += dp[i - 1][j - k]) % mod,模完之后值未賦給任何數。

上述代碼已經可以AC,但是可以進一步優化

  • dp[i][j]的遞推過程中,只用到了dp[i-1][j-k],故可以通過滾動數組優化空間。
  • 對于最內層枚舉k的循環,我們發現遞推公式等價于 d p [ i ] [ j ] = ∑ k = j ? ( i ? 1 ) j d p [ i ? 1 ] [ k ] dp[i][j] = \sum_{k=j-(i-1)}^{j} dp[i-1][k] dp[i][j]=k=j?(i?1)j?dp[i?1][k],即是dp[i-1]數組的一個前綴和,故可以預處理出前綴和,使得dp[i][j]實現O(1)遞推,優化為兩層循環。

優化后的代碼:

class Solution {
public:int numberOfPermutations(int n, vector<vector<int>>& requirements) {const int mod = 1e9 + 7;vector<int> vt(305, -1);for(auto x: requirements) vt[x[0] + 1] = x[1];vector<int> dp(405, 0);vector<int> sum(405, 0);dp[0] = 1;for (int i = 1; i <= n; ++i) {sum[0] = dp[0];for(int j = 1; j <= min(400, (1 + i) * i / 2); ++j) sum[j] = (sum[j - 1] + dp[j]) % mod;if (vt[i] != -1) {for(int j = 0; j <= min(400, (1 + i) * i / 2); ++j) dp[j] = 0;int j = vt[i];if(j < i) dp[j] = sum[j];else dp[j] = (sum[j] - sum[j - i] + mod) % mod;continue;}for (int j = 0; j <= min(400, (1 + i) * i / 2); ++j) {if(j < i) dp[j] = sum[j];else dp[j] = (sum[j] - sum[j - i] + mod) % mod;}}return dp[vt[n]];}
};

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

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

相關文章

OpenAI封殺不支持地區API:違規封號,7月9日生效

OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶 昨晚&#xff0c;很多大模型應用的開發者、程序員都收到了 OpenAI 的警告信&#xff0c;心里一驚。 OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶&#xff1a;即將封…

冒泡排序、選擇排序、插入排序~java版

1、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序的基本思想是多次遍歷待排序序列&#xff0c;每次遍歷時兩兩比較相鄰元素&#xff0c;如果順序不對則交換&#xff0c;直到整個序列有序為止。 public class BubbleSort {public static void bubbleSort(int[] arr) …

圖書管理系統(附源碼)

前言&#xff1a;前面一起和小伙伴們學習了較為完整的Java語法體系&#xff0c;那么本篇將運用這些知識連串在一起實現圖書管理系統。 目錄 一、總體設計 二、書籍與書架 書籍&#xff08;Book&#xff09; 書架&#xff08;Booklist&#xff09; 三、對圖書的相關操作 I…

已解決問題 | 該擴展程序未列在 Chrome 網上應用店中,并可能是在您不知情的情況下添加的

在Chrome瀏覽器中&#xff0c;如果你看到“該擴展程序未列在 Chrome 網上應用店中&#xff0c;并可能是在您不知情的情況下添加的”這樣的提示&#xff0c;通常是因為該擴展程序沒有通過Chrome網上應用店進行安裝。以下是解決這個問題的步驟&#xff1a; 解決辦法&#xff1a;…

Spring Boot整合Redis緩存的最佳實踐

Spring Boot整合Redis緩存的最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代應用開發中&#xff0c;緩存是提升系統性能和響應速度的關鍵技術之…

kali/ubuntu安裝vulhub

無須更換源&#xff0c;安裝docker-compose apt install docker.io docker -vdocker-compose #提示沒有&#xff0c;輸入y安裝mkdir -p /etc/docker vi /etc/docker/daemon.json #更換dockerhub國內源┌──(root?kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

【VScode】常規插件安裝

以下是VScode常規插件安裝&#xff1a; C/C C/C extension pack C/C themes Draw.io integration highlight 以上插件安裝完畢后&#xff0c;可實現 字體高亮&#xff0c;自動補齊&#xff0c;函數跳轉&#xff0c;主題切換&#xff0c;圖表生成等常用功能。

中介子方程三十七

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXXW…

【TensorFlow深度學習】對比學習的核心:實例與上下文的對抗

對比學習的核心&#xff1a;實例與上下文的對抗 對比學習概述實例與上下文的對抗&#xff1a;核心機制實戰代碼示例&#xff1a;使用PyTorch實現SimCLR結語 在深度學習的浩瀚星海中&#xff0c;對比學習作為自我監督學習的一個分支&#xff0c;正以破竹之勢引領著無標注數據利用…

dledger原理源碼分析系列(三)-選主

簡介 dledger是openmessaging的一個組件&#xff0c; raft算法實現&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何實現raft概念&#xff0c;以及dledger在rocketmq的應用 本系列使用dledger v0.40 本文分析dledger的選主 關鍵詞 Raft Openmessaging 心跳/選…

SpringMVC中的異常處理器

文章目錄 12異常處理器12.1基于配置的異常處理HandlerExceptionResolver接口直接在springmvc中聲明使用 12.2基于注解的異常處理需要書寫異常的配置類 12異常處理器 12.1基于配置的異常處理 HandlerExceptionResolver接口 接口實現類&#xff1a; DefaultHandlerExceptionR…

Linux安裝redis教程(超級詳細,新手必看)

環境&#xff1a; Centos 7.9 一、安裝準備工作 1.配置gcc 安裝redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出現依賴包問題&#xff0c;可以到主頁查看帖子解決&#xff1a;https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

這四款軟件很好用,可以提升工作、學習效率

TableConvert TableConvert是一個基于Web的在線表格轉換工具&#xff0c;能夠將多種格式的表格數據進行快速轉換。它支持將Excel、URL、HTML、JSON、CSV等格式轉換為Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用戶只需將表格數據粘貼到編輯器&#…

設置HTML元素的背景顏色

設置HTML元素的背景顏色 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將探討如何使用HTML和CSS來設置HTML元素的背景顏色。背景顏色…

本教程將指導如何通過 Vue 組件和后端 API 交互

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

常用TELNET命令及其應用

常用TELNET命令及其應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; TELNET是一種基于文本協議的網絡協議&#xff0c;主要用于遠程登錄到網絡設備和服務器…

計算機視覺全系列實戰教程 (十五):使用opencv對視頻進行基本處理

視頻處理基本介紹 1、基本概述(1)opencv中視頻處理的兩個基礎類(2)視頻的屬性&#xff1a;獲取屬性和設置屬性 2、VideoCapture的介紹(1)Why( VideoCapture類的作用)(2)How( 如何使用VideoCapture)A.播放視頻文件函數B.播放視頻文件并實現暫停和繼續 3、VideoWriter類的介紹(1)…

CJSON庫

目錄 一、介紹 1、JSON是什么 2、為什么使用CJSON 3、JSON格式 二、使用CJSON構造JSON 1、創建對象 2、添加字段 3、轉換格式 4、釋放對象 三、使用CJSON解析JSON 1、解析數據 2、 獲取字段 3、釋放對象 一、介紹 1、JSON是什么 JSON是什么呢&#xff1f;JSON全稱…

折半查找詳解

一&#xff1a;折半查找概念 折半查找&#xff08;也稱為二分查找&#xff09;是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始&#xff0c;如果中間元素正好是目標值&#xff0c;則搜索過程結束&#xff1b;如果目標值大于或小于中間元素&#x…

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…