2019 Multi-University Training Contest 1 - 1001 - Blank - dp

http://acm.hdu.edu.cn/showproblem.php?pid=6578

不會做,看題解。

設dp[i][j][k][l]表示4種顏色出現的最后的位置分別是i,j,k,l的方法數,保證i>=j>=k>=l。其實不取=號,因為同一個位置不能放兩個元素,除了開始的若干個比如dp[1][0][0][0]=4。

合法的轉移疊加:
比如
刷新的顏色是i:dp[i+1][j][k][l]+=dp[i][j][k][l]
刷新的顏色是j:dp[i+1][i][k][l]+=dp[i][j][k][l]
刷新的顏色是k:dp[i+1][i][j][l]+=dp[i][j][k][l]
刷新的顏色是l:dp[i+1][i][j][k]+=dp[i][j][k][l]

假如從dp[i][j][k][l]轉移到上述狀態會導致新狀態不滿足約束則不進行這次轉移,就太麻煩了。
由于是dp,其實只要遇到約束區間的右端點R的時候再考慮約束就可以了。

考慮四個數其實是[l,k,j,i],i肯定就是R,要是l>=L則有恰好4種顏色,否則要是k>=L則恰好3種顏色,否則要是j>=L則恰好2種顏色,否則只有1種顏色。

對每次轉移后新狀態的i維度必定是i+1,對i維度進行滾動節省空間。復雜度是精確的O(n^4+mn^3),據說很多隊覺得過不了。

還卡memset???15組數據還卡memset?

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;inline int read() {int x = 0;char c = 0;while(c < '0' || c > '9')c = getchar();while(c >= '0' && c <= '9')x = (x << 3) + (x << 1) + c - '0', c = getchar();return x;
}inline void _write(int x) {if(x > 9)_write(x / 10);putchar(x % 10 + '0');
}inline void write(int x) {_write(x);putchar('\n');
}struct Condition {int l, r, x;bool operator<(const Condition &c)const {return r < c.r;}
} con[105];const int mod = 998244353;
int n, m, dp[2][105][105][105], ctop;inline void clear0(int n) {for(int j = 0; j <= n; ++j) {for(int k = 0; k <= j; ++k) {for(int l = 0; l <= k; ++l) {dp[n & 1][j][k][l] = 0;}}}
}inline void clear1(int i, int L) {//清除==1種的for(int j = L - 1 ; j >= 0; --j) {for(int k = j ; k >= 0; --k) {for(int l = k ; l >= 0; --l) {dp[i & 1][j][k][l] = 0;}}}
}inline void clear2(int i, int L) {//清除==2種的for(int j = i ; j >= L; --j) {for(int k = L - 1; k >= 0; --k) {for(int l = k ; l >= 0; --l) {dp[i & 1][j][k][l] = 0;}}}
}inline void clear3(int i, int L) {//清除==3種的for(int j = i ; j >= L ; --j) {for(int k = j ; k >= L; --k) {for(int l = L - 1; l >= 0; --l) {dp[i & 1][j][k][l] = 0;}}}
}inline void clear4(int i, int L) {//清除==4種的for(int j = i ; j >= L ; --j) {for(int k = j ; k >= L ; --k) {for(int l = k ; l >= L; --l) {dp[i & 1][j][k][l] = 0;}}}
}inline void update1(int i) {if(ctop > m || i < con[ctop].r)return;while(ctop <= m && i == con[ctop].r) {//printf("cons %d\n", ctop);int L = con[ctop].l, x = con[ctop].x;++ctop;if(x == 1) {clear2(i, L);clear3(i, L);clear4(i, L);} else if(x == 2) {clear1(i, L);clear3(i, L);clear4(i, L);} else if(x == 3) {clear1(i, L);clear2(i, L);clear4(i, L);} else {clear1(i, L);clear2(i, L);clear3(i, L);}}
}inline void update2(int i, int j, int k, int l) {dp[(i + 1) & 1][j][k][l] += dp[i & 1][j][k][l];if(dp[(i + 1) & 1][j][k][l] >= mod)dp[(i + 1) & 1][j][k][l] -= mod;dp[(i + 1) & 1][i][k][l] += dp[i & 1][j][k][l];if(dp[(i + 1) & 1][i][k][l] >= mod)dp[(i + 1) & 1][i][k][l] -= mod;dp[(i + 1) & 1][i][j][l] += dp[i & 1][j][k][l];if(dp[(i + 1) & 1][i][j][l] >= mod)dp[(i + 1) & 1][i][j][l] -= mod;dp[(i + 1) & 1][i][j][k] += dp[i & 1][j][k][l];if(dp[(i + 1) & 1][i][j][k] >= mod)dp[(i + 1) & 1][i][j][k] -= mod;
}int solve() {ctop = 1;memset(dp[1], 0, sizeof(dp[1]));dp[1][0][0][0] = 4;update1(1);for(int i = 1; i <= n - 1; ++i) {//printf("i=%d\n", i);clear0(i + 1);for(int j = i; j >= 0; --j) {for(int k = j ; k >= 0; --k) {if(k == j && k)continue;for(int l = k ; l >= 0; --l) {if(l == k && l)continue;update2(i, j, k, l);}}}update1(i + 1);for(int j = i; j >= 0; --j) {for(int k = j; k >= 0; --k) {if(k == j && k)continue;for(int l = k ; l >= 0; --l) {if(l == k && l)continue;//printf("dp[%d][%d][%d][%d]=%d\n", i + 1, j, k, l, dp[(i + 1) & 1][j][k][l]);}}}//printf("\n");}int ans = 0;for(int j = n - 1; j >= 0; --j) {for(int k = j ; k >= 0; --k) {for(int l = k ; l >= 0; --l) {ans += dp[n & 1][j][k][l];if(ans >= mod)ans -= mod;}}}return ans;
}
int main() {
#ifdef Yinkufreopen("Yinku.in", "r", stdin);
#endif // Yinkuint T = read();while(T--) {n = read(), m = read();for(int i = 1; i <= m; ++i) {con[i].l = read(), con[i].r = read(), con[i].x = read();}sort(con + 1, con + 1 + m);write(solve());}return 0;
}

轉載于:https://www.cnblogs.com/Yinku/p/11253382.html

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

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

相關文章

給后輩的一點建議,面試必會

前言 2017年進大學開始接觸Android&#xff0c;從剛開始接觸就不斷地聽到Android市場飽和&#xff0c;工作難找等消息。雖然當時也非常迷茫&#xff0c;不過由于第一次深入接觸編程語言&#xff0c;再加上自己的一點興趣&#xff0c;就一直堅持下來了。 到現在要畢業了&#…

vue2+less開發,使用vux-loader,配置全局less變量

https://blog.csdn.net/u012396955/article/details/80184701 const webpackConfig originalConfig; // 原來的 module.exports 代碼賦值給變量 webpackConfigmodule.exports vuxLoader.merge(webpackConfig, {options: {},plugins: [{name: vux-ui},{name: less-theme, path…

美團Android開發工程師崗位職能要求,真香

前言 說起程序員人們的第一印象就是工資高、加班兇、話少錢多頭發少。再加上現在科技互聯網公司太吃香&#xff0c;bat、華為小米等公司程序員加班情況被廣泛傳播&#xff0c;程序員用生命在敲代碼的印象刻在了很多人的心里。 與其它行業一樣&#xff0c;凡是有高級和普通&…

最長遞增子序列_python_算法與數據結構

周末了&#xff0c;實驗室的網速還是不給力啊&#xff0c;不知道doctors都在干啥&#xff0c;&#xff0c;&#xff0c;最近都在做算法作業&#xff0c;昨天晚上看了一部電影《將愛進行到底》&#xff0c;剛打開電影沒多久就聽到了很熟悉的旋律&#xff0c;讓我很是驚訝&#x…

美團Android開發工程師崗位職能要求,高級面試題+解析

前言 不知道大家面試的時候&#xff0c;有沒有遇到這種情況&#xff0c;面試工資談的是10K&#xff0c;最后干著40K的活&#xff01;說著冠冕堂皇&#xff0c;提升大家能力的話&#xff0c;做著死命壓榨員工&#xff0c;996成了程序員心里的魔咒&#xff01; 初級安卓開發工程…

美團點評APP在移動網絡性能優化的實踐,吊打面試官系列!

一. 開發背景 想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 Android 相關 1. Android 之 SharedPreferences 內部原理淺析 2. Android 源碼分析-消息隊列和 Looper 3. Android 源碼分析…

軟件工程團隊項目Alpha版本產品介紹

經過完整的用戶場景定義、功能設計、開發和測試&#xff0c;耗時一個月&#xff0c;我們軟件工程的團隊項目“Academic search Conference helper”的alpha版本總算在近日出爐了。下面就來簡單介紹一下我們的產品。事實上&#xff0c;“Academic search Conference helper”是“…

美團點評APP在移動網絡性能優化的實踐,趕快收藏備戰金九銀十!

導語 事情是這樣的&#xff0c;一個關注我公眾號很久了的朋友&#xff0c;最近跟我說要去面試阿里P6&#xff0c;其實他的水平P7是夠了的&#xff0c;他開發了6年&#xff0c;一直在學習新的技術&#xff0c;Flutter&#xff0c;NDK&#xff0c;這些都有涉及&#xff0c;年紀也…

Linux學習筆記24——進程管道

一 管道的作用 通常把一個進程的輸出通過管道連接到另一個進程的輸入。 二 popen和pclose函數 #include <stdio.h>FILE *popen(const char *command,      //是要運行的程序名和相應的參數       const char *open_mode      //必須是“r”或者“w”,如…

耗時兩個禮拜,8000字安卓面試長文,建議收藏

本專欄專注分享大型Bat面試知識&#xff0c;后續會持續更新&#xff0c;喜歡的話麻煩點擊一個關注 面試官: ButterKnife為什么執行效率為什么比其他注入框架高&#xff1f;它的原理是什么 心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又開發者對butterkn…

VS2010常用快捷鍵

1、自動排版 編輯.格式化選定內容 Ctrl K&#xff0c;Ctrl F(form)根據周圍的代碼行&#xff0c;正確縮進選定的代碼行。 2、注釋與去掉注釋功能。 編輯.注釋選定內容 Ctrl K&#xff0c;Ctrl C(comment) 使用編程語言的正確注釋語法將代碼的當前行標記為注釋。 編輯.取消注…

騰訊+字節+阿里面經真題匯總,Android篇

簡介 首先&#xff0c;Android是不是真的找工作越來越難呢&#xff1f;這個可能是大家最關心的。這個受大的經濟環境以及行業發展前景的影響&#xff0c;同時也和個人因素有關。 近期一方面是所在的公司招聘Java開發人員很難招到合適的&#xff0c;投簡歷的人很少&#xff1b;…

border-image圖片邊框

一、border-image的兼容性 1、支持到IE11以上&#xff0c;其他主要瀏覽器均支持 2、使用webkit以后支持android4.3以上 二、border-image的參數&#xff08;包括圖片、裁剪位置、重復性&#xff09; 1、圖片&#xff08;border-image-source&#xff09;采用url&#xff08;&am…

騰訊3輪面試都問了Android事件分發,原理+實戰+視頻+源碼

一、架構師專題 想要掌握復雜的技術&#xff0c;必須要理解其原理和架構。本模塊結合實際一線互聯網大型項目理解架構思維&#xff0c;抽絲剝繭&#xff0c;層層深入&#xff0c;幫助大家成為Android架構師&#xff0c;在思想上對架構認識有一次升華&#xff0c;并知其所以然&a…

Java自學筆記(16):常用類:Math,Data和Calender,Format,Scanner

Math類 位于java.lang包&#xff0c;主要用于基本的算術運算&#xff0c;包含的成員都是靜態的&#xff0c;可以直接調用 兩個常量&#xff1a;PI&#xff0c;E 方法&#xff1a; sin(double a) 返回角的三角正弦。 cos(double a) 返回角的三角余弦。 tan(double a) 返回角的三…

熬夜肝完這份Framework筆記,已拿到offer

第一次觀看我文章的朋友&#xff0c;可以關注、點贊、轉發一下&#xff0c;每天分享各種干貨技術和程序猿趣事 前言 隨著移動終端的快速發展&#xff0c;Android開發人員也越來越多&#xff0c;Android開發市場也進入了一個飽和的狀態&#xff0c;Android開發人員也面臨著難找…

[LoadRunner]UTF8字符格式

前一編說到xmlrpc調用操作&#xff0c;由于有時候在xmlrpc里有中文字符的請求&#xff0c;但由于上傳的請求與服務器的編碼不匹配&#xff0c;會導致請求不成功。 那么我們就需要把服務端的編碼與客戶端的編碼統一&#xff0c;這里說一下uft8中文字符轉換 int XmlBody() {char …

現在做Android開發有前途嗎?復習指南

背景 知乎客戶端中有一個自己維護的 Hybrid 框架&#xff0c;在此基礎上開發了一些 Hybrid 頁面&#xff0c;當需要前端或者客戶端開發接口的時候&#xff0c;就涉及到聯調的問題。 和一般的 前端 <> 服務端&#xff0c;或者 客戶端 <> 服務端 類似&#xff0c;前…

TreeSet

/*Set : 無序&#xff0c;不可以重復元素|--HashSet:數據結構是哈希表&#xff0c;線程是非同步的保證元素唯一性原理&#xff1a; 判斷元素的HashCode值是否相同如果相同&#xff0c;還會繼續判斷元素的equals方法是否為True|TreeSet: 可以對集合中的元素進行排序底層數據結構…

現在做Android開發有前途嗎?社招面試心得

開頭 面試時間&#xff1a;2021.2.9 1~3面、2021.2.13 4~6面、2021.2.26 HR面 面試部門 崗位&#xff1a;商業化 - 高級 Android 開發工程師 面試感想&#xff1a;整體面得比較累&#xff0c;基礎面、交叉面、Boss面&#xff0c;前前后后對接了 6 個面試官 (離當初給我說的 3面…