動態規劃訓練之九

2022-01-29 09:17:01 字數 1494 閱讀 9829

首先能夠想到是狀壓dp模板

dp[state,i,j]表示state狀態下倒數第二個島為i,最後乙個島為j時的最優解,

num[state,i,j]為相應的路徑數目,其中state的二進位制表示的i位為1表示島i被訪問過,反之為0。

則顯然當有邊(i,j)存在時,有如下初值可賦:

dp[(1,表示此時可以更新到更優解,則更新:

dp[i,j,k]=tmp;

num[r,j,k]=num[state,i,j]。

3)如果tmp==dp[r,j,k],表示此時可以獲得達到區域性最優解的更多方式,則更新:

num[r,j,k]+=num[state,i,j]。

類似於最短路計數

最後檢查所有的狀態((1#include#include#includeusing namespace std;

int n,m;

int val[15],map[13][13];

int dp[1<<13][13][13]; //dp[state][i][j]表示state狀態下倒數第二個島為i,最後乙個島為j時的最優解

long long num[1<<13][13][13]; //num[state][i][j]為相應的路徑數目

int main()

if(n==1)

memset(dp,-1,sizeof(dp));

memset(num,0,sizeof(num));

for(int i=0;i

for(int j=0;j

if(i!=j && map[i][j])

for(int i=0;i

for(int j=0;j

if((i&(1<

for(int k=0;k

if(map[j][k] && j!=k && (i&(1<

for(int x=0;x

if(map[k][x] && j!=x && k!=x && (i&(1<

num[i|(1<

}int ans1=0;

long long ans2=0;

for(int i=0;i

for(int j=0;j

if(i!=j && map[i][j])else if(ans1==dp[(1<

ans2+=num[(1<

}cout<

}return 0;

}

動態規劃訓練之十九

題目大意 o n 求出乙個序列的本質不同的子串行個數 考慮動態規劃 dp i 表示前i位子序列的個數 很顯然如果沒有本質不同的話,子串行個數等同於子集的個數就是2n 1 但關鍵就在於這個本質不同?怎麼辦?當然考慮容斥 記vis a i 表示上一次a i 出現的位置 只要dp的時候減掉dp vis a...

動態規劃訓練之十七

題目描述 求所有 0,0 走到 n,m 路線 k 矩形個數 分析 考慮如果只是求方案數的話 很簡單乙個遞推dp i,j dp i 1,j dp i,j 1 也是乙個組合數c n m,n 再考慮把面積加上進行遞推 重新定義dp i,j 走到 i,j 之前所有方案的k矩形個數和 如果我們考慮每次豎著看一...

動態規劃訓練之十七

今天的考試題目中有單調佇列優化dp的,感覺不太熟練,所以練幾手題 其實這題就是今天的t2!首先是dp很明確 dp i,0 表示處理了前i個位置,並且第i個位置不選的最大值 dp i,1 表示處理了前i個位置,並且第i個位置要選的最大值 明顯dp i,0 max dp i 1,0 dp i 1,1 d...