做了很久的一道題。
做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...