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...