[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表示本行...