LightOJ 1057 狀壓dp,記憶化

2021-07-24 04:29:51 字數 706 閱讀 9744

題目大意:

有一張n*m的圖,上面有乙個起始點x,和最多15個金子g,每一步你可以走到相鄰的8個格仔,題目要求走完所有的金子並且返回初始點的最小路徑是多少;

題目解析:

狀態壓縮,定義dp[i][j]表示在j序列下在第i個金子需要走的最小路徑,如果是已經沒有金子的話就返回到開始點的距離,dp的時候需要記憶化搜多dfs並且列舉的時候要恢復序列的值,有點像回溯法;

ac**:

#include#include#include#include#includeusing namespace std;

const int inf=0x3fffffff;

struct point

}p[16];

int start_x,start_y,len,dp[16][1<<15];

int dfs(int pos,int x,int cnt)

for(i=1;i<=len;i++)

} return dp[pos][x]=ans;

}int main()

if(s[j]=='g')

}} p[0].x=start_x;

p[0].y=start_y;

memset(vis,0,sizeof(vis));

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

printf("case %d: %d\n",c,dfs(0,(1<

lightoj1119 簡單狀壓dp

題目大意 給你n份工作,每份工作 i 的花費是 p i i 在做第i份工作之前,如果之前做了第j份工作,就需要加上p i j 問你怎麼排列工作才能使得花費最少 1 include 2 include 3 include 4 include 5 include 6 include 7 include ...

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