洛谷狀壓DP做題記錄

2022-03-18 00:07:24 字數 1720 閱讀 6640

題面確實是狀壓的入門題 用dp[i][j] 表示以i結尾,狀態為j時的方案數,**如下:

#includeusing

namespace

std;

const

int maxn=1e6+7

;const

int n=20

;int

n,k;

ints[maxn];

long

long

dp[n][maxn];

long

long

ans;

intmaxx;

intmain()}}

}}

for(int i=0;i)

printf(

"%lld\n

",ans);

return0;

}

題面同樣是用狀壓的方式,dp[i][j]表示當前在第i個城市,狀態為j的最短路,開了o2

//

luogu-judger-enable-o2

#includeusing

namespace

std;

const

int n=25

;const

int maxn=1100010

;int dp[n][maxn];//

在第i個城市,所走過的城市集合j

intg[n][n];

intn;

int ans=2e9;

intmain()

}memset(dp,

88,sizeof

(dp));

dp[1][1]=0

;

for(int k=0;k<=(1

<1;k++)}}

}}

for(int i=2;i<=n;i++) ans=min(dp[i][(1

<1]+g[i][1

],ans);

printf(

"%d\n

",ans);

return0;

}

題面其實這道題資料範圍一眼看出就是狀壓dp,但考慮到我們如何進行狀態的設計與轉移,在狀壓dp中一定有一維表示的是當前的狀態,而在該題中我們對於狀態的定義就是dp[i][j]表示開了i個電梯,在j狀態下的重量,一開始dp陣列設為正無窮,在dp的時候找到不為正無窮的狀態來進行更新,而還有乙個貪心的思路就是沒有超限的話就一直往裡面塞,這樣可以保證分組組數是最少的。最後掃一遍,如果滿足開了某幾個電梯,並且在最大狀態下(全部都裝進去)不為正無窮,直接輸出即可。

**(看了題解)

#includeusing

namespace

std;

const

int maxn=3e6+7

;const

int inf=0x7fffffff

;int

w[maxn];

intn,k;

intmaxx;

int dp[20

][maxn];

intmain()

}for(int i=0;i1][1

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

else dp[i+1][s|(1

<1][s|(1

<}}}

}for(int i=0;i<=n;i++)

}return0;

}

洛谷2704 狀壓dp

思路 這個狀壓確實挺強。第i行的不僅僅和i 1行有關係,還和i 2行有關係。一般的思路好像解決不了問題,咋搞?我們定義乙個陣列 dp 105 1 10 1 10 dp i t1 t2 i表示的是當前行,t1表示的是當前行的狀態,t2表示的是i 1行的狀態。假設t3表示的是i 2行的狀態,列舉i 2行...

狀壓dp 洛谷P2622

狀壓dp 洛谷p2622 現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果...

數字DP做題記錄

xdu1161 一本通1588 思路 用二維陣列dp i j 表示數字取到i位的情況下,各位數字之和對題中所給n取模為j的數字個數。例如對於樣例來說,dp 1 0 表示數字最多可取到1位,各個位之和對9取模為0個數字個數,這樣的數字有兩個,即0和9。類似地,dp 1 1 1,因為1 9 1 dp 1...