3 75 15 21 75 15 28 34 70 5
188
用dp[i][j]表示前i行,第i行選第j種狀態時的最優解,
首先找出所有本行不沖突的狀態(即這一行中沒有相鄰的情況),存入state數組
計算出第i行取第j種狀態時可得到的數值stn[i][j]
那麼dp[i][j]=max{dp[i][j],dp[i-1][k]+stn[i][j]} (k表示第i-1行取第k種狀態
最終答案即為dp[n][j]中的最大值。
代碼:
#include#include #include using namespace std; const int hpn=18000; int state[hpn],stn[25][hpn],dp[25][hpn]; //dp[i][j]:前i行,第i行選第j種狀態時的最優解 int mst,map[25][25];//第i行選第j種狀態時的值 inline int bet(int x,int y) { if(x>y) return x; return y; } void find_all_state(int n) { memset(state,0,sizeof(state)); mst=0;//最多有多少種狀態 int lin=(1< >n) { if(n==0) { cout<<0<