DP 從棺材到入土

2022-05-16 21:33:36 字數 3171 閱讀 4481

p1063 能量項鍊

題目描述

思路分析

狀態轉移方程設計

\[f[i,i+k]=max(f[i,i+k],f[i,j]+f[j+1,i+k]+left_i\times right_j\times right_)\ \ (j\in [i,i+k))

\]**實現

#include#include#include#include#include#include#include#includeusing namespace std;

const int n=410;

int f[n][n];

int n;

struct nodea[n];

int main()

a[n].y=a[1].x;

for(int i=1;ip1880 [noi1995]石子合併

題目描述

在乙個圓形操場的四周擺放 \(n\) 堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的\(2\)堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出乙個演算法,計算出將 \(n\) 堆石子合併成 \(1\) 堆的最小得分和最大得分。

思路分析

狀態轉移方程設計

\[f_[i][j]=max(f_[i][j],f_[i][k]+f_[k+1][j]+s_j-s_)\ \ \ \ (k\in [i,j))

\]\[f_[i][j]=min(f_[i][j],f_[i][k]+f_[k+1][j]+s_j-s_)\ \ \ \ (k\in [i,j))

\]**實現#include#include#include#include#include#include#include#includeusing namespace std;

const int n=5e2+9;

int a[n];

int n;

int s[n];//字首和

int fmax[n][n],fmin[n][n];

int main()

for(int i=1;i<=n*2;i++)

s[i]=s[i-1]+a[i];

//memset(fmin,0x3f3f3f,sizeof(fmin));

for(int l=1;lp3146 [usaco16open]248 g

題目描述

(乙個因為翻譯而wa的「毒瘤」題)

給定乙個長度為\(n\)的區間,在區間內相鄰的且數字大小相同的兩個數字可以合併的到乙個比它\(+1\)數字

詢問可以合併成的最大數值為多少

思路分析

狀態轉移方程設計

\[f[i][i+k]=max(f[i][i+k],f[i][j]+1)\ \ (f[i][j]=f[j+1][i+k])

\]**實現#include#include#include#include#include#include#include#includeusing namespace std;

const int n=5e2+9;

int f[n][n];

int num[n];

int n;

int main()

int ans=0;

for(int k=1;k<=n;k++)//列舉區間長度

for(int i=1;i+k<=n;i++)//確保右端點在範圍內

for(int j=i;jp4170 [cqoi2007]塗色

題目描述

思路分析

狀態轉移方程設計

\[f[i][j]=min \begin f[i+1][j],f[i][j-1]\ \ \ \ (s[i]=s[j])

\\ \\ f[i][j],f[i][k]+f[k+1][j]\ \ \ \ (s[i]!=s[j])

\end\]

**實現#include#include#include#include#include#include#includeusing namespace std;

const int n=1e2+9;

int f[n][n];

char s[n];

int main()

int main()

} cin>>(s+1);

int len=strlen(s+1);

for(int i=1;i<=len;i++)

f[i][i][ques(s[i])]=true;

for(int k=1;k<=len;k++)

for(int i=1;i+k<=len;i++)

for(int j=i;jp1896 [scoi2005]互不侵犯

思路分析

狀態轉移方程設計、

設\(f[i][j][k]\)表示第\(i\)行,狀態為第\(i\)行,狀態為\(j\)時,前\(i\)行的一共放了\(k\)個國王的方案數

得到以下解題思路

\[f[i][j_1][k]=\sum f[i-1][j_2][k-sum[i]]

\]**實現#include#include#include#include#include#include#include#define int long long

using namespace std;

const int n=11;

const int m=2009;

int n,num;

int cnt;//狀態的指標

int situ[m];//可用的狀態

int sum[m];//求每乙個狀態所包含的1的數量

int f[n][(1<=n)

search(he,gs,pif+1);//這個就是表示當前位數沒有選,要選擇與他相鄰的位數

search (he+(1<>n>>num;

search(0,0,0);

for(int i=1;i<=cnt;i++)

f[1][i][sum[i]]=1; //第二唯為狀態的下標不是狀態

for(int i=2;i<=n;i++)

for(int j=1;j<=cnt;j++)//列舉當前的狀態

for(int k=1;k<=cnt;k++)//列舉上乙個的狀態

int ans=0;

for(int i=1;i<=cnt;i++)

ans+=f[n][i][num];

cout

}

Linux從入門到入土

在此開個專題,用來記錄一下在使用linux中常用的命令。持續更新 常見錯誤 dpkg i 檔名cmake dcmake install prefix usr include ar 解包 tar zxvf filename.tar 打包 tar czvf filename.tar dirname gz...

cmake 從入門到入土

你或許聽過好幾種 make 工具,例如 這些 make 工具遵循著不同的規範和標準,所執行的 makefile 格式也千差萬別。這樣就帶來了乙個嚴峻的問題 如果軟體想跨平台,必須要保證能夠在不同平台編譯。而如果使用上面的 make 工具,就得為每一種標準寫一次 makefile 這將是一件讓人抓狂的...

FFT 從入門到入土

fft 是一種可以在 o n log n 的時間複雜度內求解兩個多項式的乘積。實際上,fft 只是在求解方法上優化了 dft 離散傅利葉變換 的過程,並沒有提出新的理論。但是其高效的複雜度使得它被廣泛使用。就是使用乙個多項式的係數序列來表達這個多項式。f x sum a ix i leftright...