鏈結
思路借鑑了這個部落格:
我們可以想到狀壓dp
用乙個十進位制數來表示狀態,即第i位表示位置i處的物品等級
用f[i][j][k]表示第i天,倉庫的物品等級為j,狀態為k時的最大收益
但是狀態數貌似很多,開不下,同時上面的式子好像不太好轉移
我們可以預處理出所有的合法狀態,即無法消除的狀態,然後在預處理出所有狀態可能的轉移,即列舉空位放那些等級的物品,用e[i][j][k]表示狀態i,在第k個空位填等級為j的物品會轉移到的狀態編號,dis[i][j][k]表示這種轉移所得到的收益,這樣就方便轉移了
注意到我們還要考慮到倉庫中的物品,即會有f[i][j][k]轉移到f[i][0][s]的情況,所以我們列舉第二維的順序應該是倒序列舉(即最後考慮f[i][0]的狀態)
細節有點多,注意不要寫掛
#include #include#include
#include
#include
using
namespace
std;
const
int mn = 8
;const
int maxn = 105
;const
int mx = 25005;//
狀態總數
char
s[maxn];
intn,m,a[mn],b[mn],cnt,g[maxn];
int sit[mn],id[700005
];int
e[mx][mn][mn],dis[mx][mn][mn],head[mx];
int xiao(int *a,int pos,int &val)
int tmp=0
;
for(int i=1;i<=n;i++)
tmp=tmp*10+a[i];
if(!id[tmp]) id[tmp]=++cnt;
return
id[tmp];
}void dfs(int
x) }
}return
; }
for(int i=0;i<=5;i++)
}}int
f[maxn][mn][mx];
intdp()
if(k)
else f[i+1][g[i+1]][j]=max(f[i+1][g[i+1
]][j],f[i][k][j]);
ans=max(ans,f[i][k][j]);}}
return
ans;
}int
main()
matlab二重定積分 二重積分 matlab
第六章 用matlab 計算二重積分 由於二重積分可以化成二次積分來進行計算,因此只要確定出幾分區域,就可以反覆 使用int 命令來計算二重積分。例6.4.1 計算二重積分yd ixedxdy d是由直線 x 0,y 1,y x 所圍區域 解該積分可以寫成yy idyxe dx或yy idxxe d...
二重迴圈解題思路
題目 使用二重迴圈列印如下圖形 分析 首先要明確我們需要列印的種類有 字串 字串 空格 比如第一行,先列印了 4個空格 然後列印了乙個 我們分析一下每行的具體列印情況 第0行 先列印 4個空格,然後列印 1個 第1行 先列印 3個空格,然後列印 3個 第2行 先列印 2個空格,然後列印 5個 第3行...
迴圈的高階 二重迴圈
迴圈結構高階 int i a.length 1 i 0 i 逆序輸出陣列中的元素。外層迴圈變數變化一次,內層迴圈變數變化一遍。迴圈巢狀時要注意作用域,最外側的變數如果累加會累加全域性的變數。二重迴圈是乙個迴圈體內又包含了另乙個完整的迴圈結構 在二重迴圈中,外層迴圈變數變化一次,內層迴圈變數從初始化到...