DP練習題回顧(2)

2022-07-22 20:30:20 字數 2000 閱讀 3473

我看正解好像是\(n^2\)的,可蒟蒻的我只能想到\(n^3\),不過資料水,還是讓我卡過去了

¥( ≧ ▽ ≦ )¥

開始講演算法吧:設\(f[i][j]\)為等差數列最後一項為\(i\),倒數第二項為\(j\)的方案數,這種狀態好像有點奇怪,但還是可以做滴。

狀態定義出來了,轉移就簡單了,三重迴圈暴力列舉,當\(a[i]-a[j]==a[j]-a[k]\)時,\(f[j][i]+=f[k][j]\),最後統計答案,歐了。

#include#define re register

#define mod 998244353

using namespace std;

const int n=1005;

int n,a[n];

long long ans,f[n][n];

int main()

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

} }printf("%lld",ans);

return 0;

}

這題就比較好玩了,想了十來分鐘,都只是乙個\(o(nws)\)時間複雜度的演算法,所以就只能想想優化了啦。

這題狀態比較好想,\(f[i][j]\)為放完了前\(i\)個後,鍋內還剩\(j\)個的耐久度最大值。同時轉移方程也比較簡單:

\(~~~~~~~~~~~~~~~~~~~~~~~~ f[i][j]=max~\)\(~+a[i]\times j\)

其中\(j-1\le k\le j+s-1\)

然後你就會發現,\(tle\)滿天飛。

#include#define re register

#define min(x,y) ((x)<(y)?(x):(y))

#define max(x,y) ((x)>(y)?(x):(y))

#define inf 1e18

using namespace std;

const int n=5555;

int n,w,s,st[n],l,r;

long long a[n],que[n],f[n][n],ans=-inf;

int main()

for(re int j=1;j<=min(w,i);j++)

}}// for(re int i=1;i<=n;i++)

// for(re int i=1;i<=w;i++)ans=max(ans,f[n][i]);

printf("%lld",ans);

return 0;

}

這題輸入給的是排好隊後的序列,因為不知道每個人是從哪邊插入的佇列,所以需要一維陣列表示插入方向。

因此,狀態就出來了,\(f[i][j][0/1]\)表示從\(i\)號位置至前\(j\)位的序列,且最後乙個人是從哪個方向插入的(\(0\)表示左,\(1\)表示右

所以狀態轉移方程就出來了:

\[f[i][j][1]+=f[i-1][j-1][1]~~~~ a[i]>a[i-1]

\]\[f[i][j][1]+=f[i-1][j-1][0]~~~~ a[i]>a[i-j+1]

\]\[f[i][j][0]+=f[i][j-1][0]~~~~ a[i-j+1]

\[f[i][j][0]+=f[i][j-1][1]~~~~ a[i-j+1]

要注意的一點是:在\(j=2\)時,\(i-1=i-j+1\),會重複加,所以要特判。

#include#define re register

#define mod 19650827

using namespace std;

const int n=1005;

int n,a[n],f[n][n][2],ans;

int main()

for(re int k=j;kf[j][i]=min(f[j][i],f[j][k]+f[k+1][i]);

} printf("%d",f[1][n]);

return 0;

}

回顧(練習題)

簡述 django mvc 和 mtv mvc 全名是model view controller 是模型 model 檢視 view 控制器 controller 的縮寫 一種軟體設計典範,用一種業務邏輯 資料 介面顯示分離的方法組織 將業務邏輯聚集到乙個部件裡面,在改進和個性化定製介面及使用者互動...

練習題目2

1 將陣列a中的內容和陣列b中的內容進行交換 陣列一樣大 思路 新建乙個陣列作為中間陣列進行交換.如下 2 計算1 1 1 2 1 3 1 4 1 5 1 99 1 100的值.思路 通過每一輪迴圈給分子乘以 1來控制加數的正負號,計算出和.如下 3 編寫程式數一下1到199的所有整數 現過多少次數...

程式練習題 2

考慮如下的序列生成演算法 從整數 n 開始,如果 n 是偶數,把它除以 2 如果 n 是奇數,把它乘 3 加1。用新得到的值重複上述步驟,直到 n 1 時停止。例如,n 22 時該演算法生成的序列是 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1。人們猜想 沒有...