題面確實是狀壓的入門題 用dp[i][j] 表示以i結尾,狀態為j時的方案數,**如下:
#includeusingnamespace
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的時候找到不為正無窮的狀態來進行更新,而還有乙個貪心的思路就是沒有超限的話就一直往裡面塞,這樣可以保證分組組數是最少的。最後掃一遍,如果滿足開了某幾個電梯,並且在最大狀態下(全部都裝進去)不為正無窮,直接輸出即可。
**(看了題解)
#includeusingnamespace
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...