hdu 1565 方格取數 1 狀態壓縮dp

2021-07-05 21:24:46 字數 1143 閱讀 9353

做了很久的一道題。

做dp題要先寫出子問題。

做dp題要先寫出子問題。

做dp題要先寫出子問題。

dp[i][j]代表到第i行第j種情況,能取得的最大的數。

所以dp[i][j]=max(dp[i-1][k]+sum,dp[i][j]);

這裡k&j!=1。sum為改行的值。

定義乙個dp[20][1<<20]的陣列mle,可以定義乙個dp【1<<20】的滾動陣列。

#include

#include

#include

using

namespace

std;

int dp[2][1

<<20];

int s[20000];

int n;

intmap[25][25];

int k=0;

void solve(int x,int y)

dp[p][s[j]]=max(sum+dp[1-p][s[i]],dp[p][s[j]]);}}

solve(x+1,y+1);

return ;

}int main()

dp[0][s[i]]=sum;

}solve(0,1);

int maxv=0;

for(int i=1;iint d=(n-1)&1;

maxv=max(dp[d][i],maxv);

}cout

0;}

不過這份**耗時比較大,應該是有可以優化的地方。

優化後的**

#include

#include

#include

using

namespace

std;

int dp[2][1

<<20];

int s[20000];

int n;

intmap[25][25];

int main()

dp[p][s[k]]=maxv+sum;}}

int maxn=0;

int d=(n-1)&1;

for(int i=0;iif(s[i]<(1

0;}

HDU 1565 方格取數 1

hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...

HDU1565 方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

HDU 1565 方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...