洛谷 P4933 大師(dp)

2022-02-13 12:07:41 字數 896 閱讀 1873

設dp[i][j]表示選出了第i個電塔,上乙個選出的是第j個電塔的方案數。

列舉i,j,轉移方程為:

找乙個k,使得h[k],h[j],h[i]構成等差數列,並且kdp[i][j]+=dp[j][k];

對於確定的i,j,h[k]是確定的,所以我們可以用vector a[i]的高度為i的編號,k即為列舉a[h[k]]裡的元素。

為了防止快樂的re,

要判斷計算出的h[k]是否<0或者》=maxv。

時間複雜度不太會算,看起來像是在o(n^2)到o(n^3)之間,貌似重複元素個數不同時間不同……

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn=1005;9

const

int maxv=20005;10

const

int mod=998244353;11

intn,h[maxn],dp[maxn][maxn],ans;

12 vectora[maxv];

13int

main()

1426

for(int k=0;k)

30 ans=(ans+dp[i][j])%mod;31}

32a[h[i]].push_back(i);33}

34 cout<

35return0;

36 }

//明天還上課,困死了,睡覺睡覺…………

洛谷 P4933 大師(DP)

方程的設計比較難想 設f i j 表示等差數列的最後乙個數的位置為i,公差為j的方案數。轉移的話 列舉k從1到i,f i j f k j 最後累加答案,注意ans i的含義 乙個及兩個的方案數 ac 1 include2 include3 using namespace std 4const int...

洛谷 P4933 大師

題面 實名推薦 本題的出題人小哥哥打球暴帥哦!apio ctsc wc的時候一起打過球w,而且大學在我隔壁喔 沒仔細看資料範圍的時候真是摸不著頭腦。還以為要 o n 2 dp 爆錘。後來發現v 20000,這能幹啥呢?至少我的暴力是可以趁機跑過了2333,暴力如下 我們列舉每一種公差,然後每一輪 先...

洛谷 P4933 大師 題解(dp)

設定 dp i j 表示以 i 結尾公差為 j 的等差數列個數 你可能會想為什麼是 i 結尾而不是開始呢,其實你會發現如果設以 i 開始根本不知道怎麼設狀態轉移方程 注意轉移方程要設定偏移量p,要不然陣列可能就會負數。所以陣列開大兩倍。還有要注意ans加的不是dp i a i a j p 因為可能後...