摸魚(一)(狀壓dp)

2021-08-20 13:32:50 字數 1193 閱讀 9120

(1),我的狀壓dp這樣表示

用dp[i][j]表示從前面位置到當前位置的能最大值(不記錄後乙個為的值,但是標記,後乙個位置是否選擇)(在考慮狀態的情況下),我的每個i位置表示,其前面,後面以及本身位置的選擇,

(000) (這三個位置都沒有選擇)dp[i][j] = vmax[i-2];

(001) (只選擇前乙個位置) dp[i][j] = (dp[i-1][2]) > (dp[i-1][3]) ? (dp[i-1][2]) : (dp[i-1][3]);

(010) (只選擇當前位置)dp[i][j] = (dp[i-1][4] + 2 * v[i]) > (dp[i-1][4] + 2 * v[i]) ? (dp[i-1][5] + 2 * v[i]) : (dp[i-1][5] + 2 * v[i]);

(011) (不選擇後乙個位置)(dp[i-1][6] + v[i]) > (dp[i-1][7] + v[i]) ? (dp[i-1][6] + v[i]) : (dp[i-1][7] + v[i]);

(100)(只選擇後乙個位置)dp[i][j] = 0;

(101)(不選擇當前位置)dp[i][j] = (dp[i-1][2]) > (dp[i-1][3]) ? (dp[i-1][2]) : (dp[i-1][3]);

(110)(不選擇前乙個位置)(dp[i-1][4]) > (dp[i-1][5]) ? (dp[i-1][4]) : (dp[i-1][5]);

(111)(都選擇)dp[i][j] = (dp[i-1][6]) > (dp[i-1][7]) ? (dp[i-1][6]) : (dp[i-1][7]);

最後考慮一下邊界就行了。

**:

#include #include #include #include using namespace std;

typedef long long ll;

typedef unsigned long long llu;

const int maxn = 1e6+5;

const ll inf = 0x3f3f3f3f3f3f;

ll v[maxn],dp[maxn][8],vmax[maxn];

int main()

vmax[i] = maxx;

} printf("%lld\n",vmax[t]);

return 0;

}

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

狀壓dp學習

p2704 炮兵陣地 1038 裁玻璃 狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。dp的引數 物品個數 行數等 當前狀態 上乙個狀態 將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解 i...