10 28 DP 序列 專項練習 題解

2022-06-29 22:21:13 字數 1055 閱讀 2692

nodgd出了一道坑爹題但還沒造資料,這道題的資料是乙個長度為\(n\)的顏色序列,每個顏色都是紅綠藍三種顏色之一,且滿足\(m\)個約束條件,每個條件都形如:第\(l_i\)到第\(r_i\)個顏色共有\(x_i\)種。請你計算共有多少種符合條件的顏色序列,答案\(\bmod 10^9+7\) 。

本題是序列問題,多用dp解決,我們不妨設狀態\(f[i][j][k]\)表示在當前位置i,除當前位置離i最近的不同顏色的位置為j,最後一種顏色離i最近的位置為j,則可以得出遞推式

時間複雜度\(o(n^3)\)。

在寫**時一定要注意要將\(i,j,k\)按大小依次列舉,這樣既保證了後兩位離i的距離前短後長,又方便列舉。\(i,j,k\)都可以取到0,可以使用\(j <= i - (i > 0)\)列舉0,最後如果\(i\)在限制區間的右端點上,暴力列舉,將不為\(x_i\)的狀態賦值為0即可。

#include using namespace std;

#define r register

typedef long long ll;

const int mod = 1e9 + 7;

const int maxn = 3e2 + 5;

long long f[maxn][maxn][maxn];

struct node

;bool cmp(node a,node b)

node a[maxn];

int main()

}i++;

while(i == a[cnt].r)

else if(a[cnt].v == 2)

else if(a[cnt].v == 3)

cnt++;

}} ll ans = 0;

for(r int i = 0;i <= n; i++)

for(r int j = 0;j <= (i - (i > 0)); j++)

ans = (ans + f[n][i][j]) % mod;

printf("%lld", ans);

return 0;

}

基礎練習題解

1.矩形相交面積 問題描述 平面上有兩個矩形,它們的邊平行於直角座標系的x軸或y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。輸入格式 輸入僅包含兩行,每行描述乙個矩形。在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10 7的實數表示...

DP練習題回顧(2)

我看正解好像是 n 2 的,可蒟蒻的我只能想到 n 3 不過資料水,還是讓我卡過去了 開始講演算法吧 設 f i j 為等差數列最後一項為 i 倒數第二項為 j 的方案數,這種狀態好像有點奇怪,但還是可以做滴。狀態定義出來了,轉移就簡單了,三重迴圈暴力列舉,當 a i a j a j a k 時,f...

多重迴圈練習題解

案例1 判斷2 100之間有多少個素數,並輸出所有素數。程式分析 1 素數 只能被1和其本身整除 合數 除了1和其本身之外,還有其他因數。2 判斷素數的方法 用乙個數分別去除2到 這個數 如果能被整除,則表明此數不是素數,反之是素數。解題步驟 1 首先明白任意乙個數如何判斷是不是質數 素數 以數字9...