POJ 1187 隕石的秘密 (線性DP)

題意:

公元11380年,一顆巨大的隕石墜落在南極。于是,災難降臨了,地球上出現了一系列反常的現象。當人們焦急萬分的時候,一支中國科學家組成的南極考察隊趕到了出事地點。經過一番偵察,科學家們發現隕石上刻有若干行密文,每一行都包含5個整數:?
1 1 1 1 6?
0 0 6 3 57?
8 0 11 3 2845?
著名的科學家SS發現,這些密文實際上是一種復雜運算的結果。為了便于大家理解這種運算,他定義了一種SS表達式:?
1. SS表達式是僅由'{','}','[',']','(',')'組成的字符串。?
2. 一個空串是SS表達式。?
3. 如果A是SS表達式,且A中不含字符'{','}','[',']',則(A)是SS表達式。?
4. 如果A是SS表達式,且A中不含字符'{','}',則[A]是SS表達式。?
5. 如果A是SS表達式,則{A}是SS表達式。?
6. 如果A和B都是SS表達式,則AB也是SS表達式。?


例如?
()(())[]?
{()[()]}?
{{[[(())]]}}?
都是SS表達式。?
而?
()([])()?
[()?
不是SS表達式。?

一個SS表達式E的深度D(E)定義如下:?
?
例如(){()}[]的深度為2。?

密文中的復雜運算是這樣進行的:?
設密文中每行前4個數依次為L1,L2,L3,D,求出所有深度為D,含有L1對{},L2對[],L3對()的SS串的個數,并用這個數對當前的年份11380求余數,這個余數就是密文中每行的第5個數,我們稱之為?神秘數?。?
密文中某些行的第五個數已經模糊不清,而這些數字正是揭開隕石秘密的鑰匙。現在科學家們聘請你來計算這個神秘數。?

思路:

初始想法:我們令dp[l1][l2][l3][d]為用了l1個小括號,l2個中括號,l3個大括號,深度恰好為d時的方案數,現在我們來找狀態之間的聯系。然而我們可以發現一個殘酷的事實,光用4個變量無法很好的表示一個狀態。比如,我們添加一個小括號,當前狀態帶表的括號序列中,有一部分序列的深度增加了,有一部分沒有增加,所以為了正確的轉移狀態,正常想法就是用狀壓之類的記錄具體方案,然而這個題就。。。

我們可以發現,新添加一個括號,括號序列的深度最多增加1,要么就不變,所以,如果dp[l1][l2][l3][d]表示的是用了l1個小括號,l2個中括號,l3個大括號,深度小于等于d的方案數就很好辦了,添加一個括號后從深度小于等于d的狀態轉移到深度小于等于d + 1的狀態。

則等于d的方案數 = 小于等于d的方案數 - 小于等于d - 1的方案數。

還有一個問題,我們怎么不重不漏的寫出狀態轉移的過程?我們可以發現,所有深度小于等于d的括號序列是由若干個深度小于等于d的嵌套的括號構成的,所以,我們可以這樣轉移狀態:我們把當前狀態分成2個部分,一個部分用來形成嵌套的括號,另一部分對應的是那個狀態的方案數。我們枚舉向最里面添加什么括號。因為大括號外面不能有其它的括號,所以當在最里面套大括號時,只能有大括號。例如,當前嵌套形的括號是{[()]},我們不能向里面添加{},但是添加小括號可以,變成{[(())]}。同理,枚舉狀態時,當添加的是中括號時,外面只能是中括號和大括號。

思路和代碼實現參考了這篇博客:https://blog.csdn.net/Flying_Stones_Sure/article/details/7954114

代碼:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int mod = 11380;
int dp[11][11][11][31];
bool v[11][11][11][31];
int dfs(int l1, int l2, int l3, int deep) {if (l1 == 0 && l2 == 0 && l3 == 0) {v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep] = 1;}if (deep == 0) {v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep]  = 0;}if (v[l1][l2][l3][deep])return dp[l1][l2][l3][deep];int ans = 0;for (int i = 0; i <= l3; i++) {if (i) {ans = (ans + dfs(0 , 0, i - 1, deep - 1) * dfs(l1, l2, l3 - i, deep)) % mod;}for (int j = 0 ;j <= l2; j++) {if (j) {ans = (ans + dfs(0, j - 1, i, deep - 1) * dfs(l1, l2 - j, l3 - i, deep)) % mod;}for (int k = 1; k <= l1; k++) {ans = (ans + dfs(k - 1, j, i, deep - 1) * dfs(l1 - k, l2 - j, l3 - i, deep)) % mod;}}}v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep] = ans;
}
int main() {int n, m, d, t;while(~scanf("%d%d%d%d", &n, &m, &t, &d)) {dfs(n, m, t, d);if(d) dfs(n, m ,t, d - 1);if(d) {printf("%d\n", (dp[n][m][t][d] - dp[n][m][t][d - 1] + mod ) % mod);} else {printf("%d\n", dp[n][m][t][d]);}}
}

  

轉載于:https://www.cnblogs.com/pkgunboat/p/10339523.html

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

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

相關文章

bzoj2561 最小生成樹

題意&#xff1a;給你無向圖&#xff0c;給定一條邊&#xff0c;求至少在原圖中刪去多少邊才能使它同時在某個最大生成樹和某個最小生成樹中。 解&#xff1a; 假裝我們把邊排序了&#xff0c;然后把所有邊權小于給定邊的邊都加進去了。 那么我們要刪的就是s到t的一個割。 最大…

Android應用開發—onSaveInstanceState方法什么時候被調用?

轉載自onSaveInstanceState方法什么時候被調用?&#xff08;轉載/整理&#xff09; 在 Activity 被銷毀之前被調用來保存每個實例的狀態&#xff0c;這樣就可以保證該狀態能夠從 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢復過來。 本方法在 Activity 可能被銷毀…

記一次phpstudy重啟后Apache無法啟動

相信大家都碰到過phpstudy中Apache無法啟動的情況1、首先檢查80端口是否占用&#xff0c;有的話就管理2、檢查是否缺少vc9運行文件如果上述兩種方法還不能解決問題就進入安裝目錄中Apache的bin目錄下&#xff0c;在命令行窗口中執行httpd.exe&#xff0c;看看是否報錯。我就是在…

C#任務調度——LimitedConcurrencyLevelTaskScheduler

這是參考大佬分享的代碼寫的有問題請提出指正&#xff0c;謝謝。using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TaskManager {class TaskFactoryMa…

同步本地遠程分支 git remote prune origin

git remote prune origin &#xff08;不常用總忘記&#xff0c;記錄下&#xff09;

264 參考幀 list0 list1

作了這么久的h264工作&#xff0c;這部分還一直從未去深入了解過&#xff0c;真是不求甚解啊&#xff0c;那幫老外的代碼也寫得太全了&#xff0c;該部分至今天才開始研究 首先參考幀這里關注的是兩種&#xff0c;p ,b ,前向參考和后向參考 由白皮書中看到&#xff0c;p幀的參…

面試官問我:什么是JavaScript閉包,我該如何回答

閉包&#xff0c;有人說它是一種設計理念&#xff0c;有人說所有的函數都是閉包。到底什么是閉包&#xff1f;這個問題在面試是時候經常都會被問&#xff0c;很多小白一聽就懵逼了&#xff0c;不知道如何回答好。這個問題也有很多朋友在公眾號給李老師留言了&#xff0c;問題表…

robotframework基礎學習(8)

變量的使用 在 Edit 標簽頁中主要分&#xff1a;加載外部文件、定義內部變量、定義元數據等三個部分。 &#xff08;1&#xff09;&#xff1a;加載外部文件Add Library&#xff1a;加載測試庫&#xff0c;主要是[PYTHON 目錄]\Lib\site-packages 里的測試庫 Add Resource&…

版本字符串比較工具接口常用接口函數

版本升級比較常用的接口&#xff0c;字符串解析&#xff0c;不是很難&#xff0c;但沒必須重復造輪子&#xff0c;保存一份網上搜到的實現&#xff1a; /*** 比較版本號的大小,前者大則返回一個正數,后者大返回一個負數,相等則返回0** param version1* param version2* return…

[藍橋杯]ALGO-188.算法訓練_P0504

Anagrams指的是具有如下特性的兩個單詞&#xff1a;在這兩個單詞當中&#xff0c;每一個英文字母&#xff08;不區分大小寫&#xff09;所出現的次數都是相同的。例如&#xff0c;Unclear和Nuclear、Rimon和MinOR都是Anagrams。編寫一個程序&#xff0c;輸入兩個單詞&#xff0…

什么是3-2混合

正如上面所述&#xff0c;電影轉換成視頻時&#xff0c;每秒24幀必須轉成每秒60場&#xff08;30幀&#xff09;。實現這一點的方法是把電影的第一幀顯示3場&#xff0c;然后把第二幀顯示2場&#xff0c;再把第三幀顯示3場&#xff0c;以此類推。這個3-2-3-2-3-2的順序就被稱為…

shell 的here document 用法、輸入/輸出重定向

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 什么是Here Document Here Document 是在Linux Shell 中的一種特殊的重定向方式&#xff0c;它的基本的形式如下 cmd << delimiter…

beta第二天

團隊成員 鄭西坤 031602542 &#xff08;隊長&#xff09; 陳俊杰 031602504陳順興 031602505張勝男 031602540廖鈺萍 031602323雷光游 031602319吳志鴻 0316206341.昨天的困難 陳順興&#xff1a;無 廖鈺萍&#xff1a;無 吳志鴻&#xff1a;沒有 雷光游&#xff1a;無 鄭西坤…

void和void *

void f(void) { // 參數void可以省略cout << "aa"<<endl; } int t 22; int *a &t; void *p; // void *可以被賦值為其他類型 p a; cout << *(int *)p; // 使用的時候必須轉到那個類型 轉載于:https://www.cnblogs.com/pjishu/p/10343587.…

Android應用開發—Application

What is Application Application和Activity&#xff0c;Service一樣是android框架的一個系統組件&#xff0c;當android程序啟動時系統會創建一個application對象&#xff0c;用來存儲系統的一些信息。通常我們是不需要指定一個Application的&#xff0c;這時系統會自動幫我們…

C語言符號

C語言運算符的優先級 一、運算符的優先級表 C 語言的符號眾多&#xff0c;由這些符號又組合成了各種各樣的運算符。既然是運算符就一定有其特定的優先級&#xff0c;下表就是C 語言運算符的優先級表&#xff1a; 注&#xff1a;同一優先級的運算符&#xff0c;運算次序由結合…

手機按鍵中控運行思路的個人理解

目前而言基本的自己理解的中控多線程腳本無非就是兩種1.主代碼作為腳本功能的載體 另外開辟一個線程作為和中控保持聯系的部分(下面只是思路 無法直接運行)Import "zm.luae" zm.Init /* 該思路下的基本流程 從UI界面獲取到云賬號 和 本地的配置信息---->根據自己…

burp過期了,換一個

先從吾愛破解論壇下載工具&#xff1a;https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip 工具運行需要Java環境&#xff0c;請自行安裝&#xff0c;此處不贅述。解壓完后雙擊keygen 填一下License Text(隨意)&#xff0c;然后點擊Run…

加載一張圖片到ImageView到底占據多少內存

https://blog.csdn.net/BUG_delete/article/details/79557939 簡介 Android中經常要通過ImageView進行圖片資源顯示。在加載圖片時&#xff0c;首先要考慮的兩個因素就是體驗問題和性能問題。 其中&#xff0c;體驗問題是指圖片顯示的是否正確&#xff08;例如Universal-Imag…

mysql -u root -p 解釋

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 mysql -u 用戶名 -p 密碼 是連接數據庫服務器的命令。要求你輸入自己連接數據庫的用戶名和密碼。 考慮密碼如果直接明文寫在這條命令行…