設定 dp[ i ][ j ] 表示以 i 結尾公差為 j 的等差數列個數
你可能會想為什麼是 i 結尾而不是開始呢,其實你會發現如果設以 i 開始根本不知道怎麼設狀態轉移方程
注意轉移方程要設定偏移量p,要不然陣列可能就會負數。所以陣列開大兩倍。
還有要注意ans加的不是dp[ i ][ a[ i ] - a[ j ] + p ]因為可能後面這個式子還會變化,那麼就會加兩次
所以加dp[ j ][ a[ i ] - a[ j ] + p ]+1即可
這個題目的轉移方程值得學習,第二維逆向
#include#include#include#includeusing namespace std;
const int maxn=1e3+5;
const int mod=998244353;
const int p=2e4+5;//偏移量
int n,a[maxn],ans,dp[maxn][p<<1];
int main()
for(int i=1;i<=n;i++)
}printf("%d\n",ans);
return 0;
}
洛谷 P4933 大師(dp)
設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 裡的元...
洛谷 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,暴力如下 我們列舉每一種公差,然後每一輪 先...