模板題 數字DP 狀態壓縮 記憶化搜尋

2021-10-18 17:30:35 字數 3348 閱讀 4963

dp啊!難的真難,簡單的也真簡單,正讓人哭笑不得,喜憂參半 ?

完全揹包解法

狀態表示:f[i][j]表示只從1~i中選,且總和等於j的方案數

狀態轉移方程:f[i][j] = f[i - 1][j] + f[i][j - i]

#include

using

namespace std;

const

int n=

1010

,mod=

1e9+7;

int n;

int f[n]

;int

main()

另解:

狀態表示:f[i][j]表示總和為i,總個數為j的方案數

狀態轉移方程:f[i][j] = f[i - 1][j - 1] + f[i - j][j];

#include

using

namespace std;

const

int n=

1010

,mod=

1e9+7;

int n;

int f[n]

[n];

intmain()

#include

using

namespace std;

const

int n=10;

/*0的第一種情況:001~abc-1, 999

其餘數字:000~abc-1[1也特判]

以某數字出現在第4位為例

abc 1. num[i] < x, 0

2. num[i] == x, 0~efg——>efg+1

3. num[i] > x, 0~999 ——>1000

*/int

get(vector<

int> num,

int l,

int r)

//把按位數儲存的數字轉化成乙個整數

intpower10

(int x)

//10^x

intcountt

(int n,

int x)

//1~n中x出現的次數

n=num.

size()

;int res=0;

for(

int i=n-1-

!x;i>=

0;i--

)//列舉數字i可以出現在哪一位上,0時要特判

if(num[i]

==x) res+

=get

(num,i-1,

0)+1

;else

if(num[i]

>x) res+

=power10

(i);

}return res;

}int

main()

return0;

}

#include

using

namespace std;

const

int n=

12,m=

1

int n,m;

long

long f[n]

[m];

bool st[m]

;int

main()

else cnt++;if

(cnt&

1) st[i]

=false;}

memset

(f,0

,sizeof f)

; f[0]

[0]=

1;for(

int i=

1;i<=m;i++

)//列舉每一列

for(

int j=

0;j<

1<)//列舉第i行的狀態

for(

int k=

0;k<

1<)//列舉第i-1行的狀態if(

(j&k)==0

&&st[j|k]

) f[i]

[j]+

=f[i-1]

[k];

cout<]<}return0;

}

#include

using

namespace std;

const

int n=

20,m=

1

int w[n]

[n];

int f[m]

[n];

intmain()

#include

using

namespace std;

const

int n=

6010

;int n;

int h[n]

,e[n]

,ne[n]

,idx;

int w[n]

,f[n][2

];bool st[n]

;//判斷是否有根節點

void

add(

int a,

int b)

void

dfs(

int u)

}int

main()

int root=1;

//按照序號尋找根節點

while

(st[root]

) root++

;dfs

(root)

; cout<<

max(f[root][0

],f[root][1

])

}

#include

using

namespace std;

const

int n=

310;

int n,m;

int g[n]

[n];

int f[n]

[n];

int dx[4]

=,dy[4]

=;intdp

(int x,

int y)

return v;

}int

main()

模板 狀態壓縮dp

問題描述 給定一張 n個點的帶權無向圖,點從 0 n 1 標號,求起點 0 到終點 n 1 的最短hamilton路徑。hamilton路徑的定義是從 0 到 n 1 不重不漏地經過每個點恰好一次。輸入格式 第一行輸入整數n。接下來n行每行n個整數,其中第i行第j個整數表示點i到j的距離 記為a i...

狀態壓縮DP入門題

在n n n 20 的方格棋盤上放置n 個車 可以攻擊所在行 列 求使它們不 能互相攻擊的方案總數。僅供和我一樣的菜鳥們參考 以n 4為例子解析原始碼 include include using namespace std int64 a 1100000 int main cout 前乙個狀態壓縮的...

狀態壓縮DP入門題

1 本題為狀態壓縮題 2題目大意 3乙個矩陣裡有很多格仔,每個格仔有兩種狀態,可以放牧和不可以放牧,4可以放牧用1表示,否則用0表示,在這塊牧場放牛,要求兩個相鄰的方 5格不能同時放牛 不包括斜著的 即牛與牛不能相鄰。問有多少種放牛方 6案 一頭牛都不放也是一種方案 7要列舉每一行中的是否種植 也就...