狀壓dp學習

2021-10-05 22:35:22 字數 2114 閱讀 3100

[p2704 炮兵陣地](

[1038: 裁玻璃](

狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。

dp的引數:

物品個數、行數等

當前狀態

上乙個狀態

將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解

#include

#define intn long long

using

namespace std;

main

(void)}

int dp[

2000][

10];for

(int i=

0;i<=n;i++

)for

(int j=

0;j<=

9;j++

) dp[i]

[j]=

999999

;for

(int i=

0;i<=n;i++

) dp[i][0

]=0;

int ans=

999999

;for

(int i=

1;i<=n;i++

)for

(int j=

0;j<=

1<<

3;j++

)//前乙個狀態

int flag=0;

for(

int i=

1;i<=n;i++)}

if(flag==0)

cout<<

"-1"

;else

cout<}

滾動陣列只需要2組

列舉上邊兩列的狀態

#include

using

namespace std;

int n,m,ans,dp[(1

<<10)

][(1

<<10)

][13]

/*滾動陣列*/

,a[115

],sum[(1

<<10)

];char x;

intgetsum

(int s)

//當前狀態 s 裡面包含幾個 1

return tot;

}int

main()

}}for(

int l=

0;l<(1

<;l++

)for

(int s=

0;s<(1

<;s++

) ans=

max(ans,dp[l]

[s][

(n-1)%

3+2]

);//結束狀態可以是最後一行的任何狀態

cout

}

從第二行開始,列舉上一行狀態和本行狀態。

#include

#define intn long long

using

namespace std;

int dp[

1100][

1100

],a[

1100

],s[

1100];

intgetsum

(int s)

return res;

}int

judge1

(int s1,

int sd)

intjudge2

(int s1,

int s2)

main

(void)}

for(

int i=

0;i<(1

<;i++

)for

(int i=

2;i<=n;i++)}

}int ans=0;

for(

int i=

0;i<(1

<;i++

)printf

("%d\n"

,ans);}

}

學習筆記 狀壓dp

f i j 表示匹配到字串的第 i 位狀態為 j 的方案數 那麼方程就很明顯了,每次列舉第 i 位的字母 alpha 然後 o n 判斷就好了 時間複雜度 o 26tlen2 nn code below include define ll long long using namespace std ...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

狀壓dp小記

鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...