怎麼辦,膜你賽要掛慘了,下午我還在學區間\(dp\)!
不管怎麼樣,計畫不能打亂\(4\)不\(4\)。。
為啥我一開始就先弄模板呢?因為這東西看模板就能看懂。。。
for(int i=2;i<=len;i++)//列舉區間長度
{ for(int l=1,r=l+len-1;r<=n;l++,r++)//列舉左端點和右端點
{ //以下你可以搞一下事情
for(int k=l;k以上就是區間dp的大體模板,至於為啥,感性理解一下就好了
為啥我一開始就弄加強版呢?因為普通版就在加強版裡面哇\(qwq\)
傳送門這道題目是說乙個環形操場,然後合併成一堆的最大值和最小值
注意加粗的字型,環形操場?
好吧,這就是乙個環形\(dp\),通常的就是複製一遍,斷環為鏈,別問我為啥是這樣
然後就是狀態轉移方程。\(dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])\)與\(dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r])\)
**#include#include#include#include#includeusing namespace std;
const int n = 1000;
int n,a[1000],dpmax[n][n],dpmin[n][n],sum[n];
int main()
{ scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]),a[i+n]=a[i];
for(int i=1; i<=n*2; i++)
sum[i]=sum[i-1]+a[i];
memset(dpmin,0x3f,sizeof(dpmin));
for(int i=1; i<=n*2; i++)dpmin[i][i]=0;
for(int len=2; len<=n; len++)
{for(int l=1,r=len+l-1; r<=n*2; l++,r++)
{for(int k=l; k傳送門
這道題也是\(dp\)問題,不算特別的裸,畢竟用到了字串。
因為我們要判斷括號的合法性,所以我們在列舉左端點和右端點的時候,只要合法,括號序列就\(+2\),也就是\(dp[l][r]=dp[l+1][r-1]+2\)
這個看不懂的人不多吧
#include#include#include#include#includeusing namespace std;
char s[255];
int dp[300][300];
int main()
{ while(1)
{ cin >> s+1;
if(s[1]=='e')break;
memset(dp,0,sizeof(dp));
int len=strlen(s+1);
for(int i=2; i<=len; i++)
{ for(int l=1,r=i+l-1; r<=len; l++,r++)
{if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
dp[l][r]=dp[l+1][r-1]+2;
for(int k=l; k關於區間\(dp\)還有乙個東西叫做四邊形不等式優化,\(emmm\)這東西以後再學
區間dp學習筆記
定義 區間動態規劃問題一般都是考慮,對於每段區間,他們的最優值都是由幾段更小區間的最優值得到,是分治思想的一種應用,將乙個區間問題不斷劃分為更小的區間直至乙個元素組成的區間,列舉他們的組合 求合併後的最優值。設f i,j 1 i j n 表示區間 i,j 內的數字相加的最小代價最小區間f i,i 0...
學習筆記 區間dp
f l r w i n g 表示區間 l,r 中能否壓縮成 w i n g code below include using namespace std const int maxn 200 10 int n,w,i,n,g,le maxn fir maxn sec maxn f maxn maxn...
區間DP學習筆記
顧名思義 區間dp就是在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。題目描述給出乙個長度為n的字串,每次可以刪除乙個字母相同的子串,問最少需要刪多少次。資料規模 n 500 輸入格式第1行 1個整數,表示字串的長度 第2行 n個字...