rt,今天s醬不在家~
於是w就可以為所欲為的刷水題啦~
因為w的dp學的實在是……,於是今天w去刷了幾道dp題練手》_<
1.能量項鍊(luogu p1063)
這題面……考驗語文能力的時刻到了x
一道區間dp
這個環結構看起來就很麻煩的樣子……
那就拆了o(∩_∩)o~
每次讀入乙個a[i]的時候,順手把a[n+i]也賦成這個值
這樣處理完後就是乙個長度為原環兩倍的鏈
在這個鏈上能找到所有長度為n+1的可能排列
//長度n+1是因為最後乙個珠子的尾標是第乙個的頭標,在鏈中即下乙個的頭標
接下來就dp吧
f[i][j]表示區間長度為i,區間左端點的頭標記是j
有了這兩個當然就能算出右端點的尾標記
然後列舉一波斷點(區間dp的套路
因為每個珠子有兩個標記,又只存了乙個數
導致各種+1-1的小細節
qwq看了好久才明白
最後再統計一波答案
#include#includeenergyusing
namespace
std;
const
int n=202
;int
n,a[n],ans;
intf[n][n];
intmain()
for(int i=2;i<=n+1;++i)//
區間長度
}for(int i=1;i<=n;++i)//
區間開始位置
ans=max(ans,f[i][i+n]);
cout
return0;
}
2.垃圾陷阱(luogu p1156)
為什麼是卡門不是bessie(
剛一看題面各種mengbier,連dp存什麼都想不出來
跑去看題解,類揹包?++mengbier
看了好久才看懂……做法很神奇x
學了一種刷表的做法
(亂入的科普:刷表指用現在的狀態去更新之後的狀態,與之相反的是填表,指用之前的狀態更新現在的狀態)
dp陣列?不存在的
這裡的所謂dp陣列其實是乙個bool陣列
裡面存的,既不是高度,也不是能量
f[i][j]表示的是在高度為i,時間為j的情況下能否存活
如果能存活的話就向下轉移
兩個轉移方向:堆起來(i+高度)或者吃掉(j+時間)
轉移完發現高度超出井深了,因為經過了排序,所以得出的一定是最早的時間,輸出就好了
一套迴圈下去這牛還沒有出去,說明它已經在井裡gg了
時間從後向前倒,看它活在這世上的最後一秒是什麼時候
//rubbish well傳說中的刷表法qwq
#include#include
#include
using
namespace
std;
int d,g,s=10
;bool f[400][6000];//
f[i][j]->高度為i的情況下能存活j的時間
struct
rubr[
105];
bool
cmp(rub x,rub y)
intmain()
sort(r+1,r+g+1
,cmp);
f[0][10]=1
;
for(int i=1;i<=g;++i)//
垃圾 for(int j=d-1;j>=0;--j)//
高度 for(int k=s;k>=r[i].t;--k)//
時間
else
}for(int i=s;i>=1;--i)
if(f[0
][i])
return
0;
}
3.過河(luogu p1052)
一開始一看,這不是某只⑨的一道題嗎?
然後一看資料範圍,
l<=10^9,1 <= m <= 100
(步長10橋長10^9,心疼這只青蛙一下x)
正常的dp方程很好寫
f[j]=min(f[j],f[i]+stn[j])
然而10^9的資料,時間空間都會炸
但是因為長長的橋上只有很少的石子
所以在兩個石子之間青蛙君會跳過一段很長的沒有石子的距離
就可以把這段距離壓縮一下
把距離》100(10*10)的兩顆石子中間的距離壓到100
……據說還可以壓到90?並不理解qwq,反正有100就夠用了
#include#include過河呀s醬回來了》_<#include
using
namespace
std;
const
int n=50000
;int l,s,t,m,a[200
],stn[n],f[n],tmp;
intmain()
for(int i=1;i<=m;++i)
int ans=200
;
for(int i=1;i<=l+15;++i)f[i]=200
; f[
0]=0
;
for(int i=0;i<=l+15;++i)
for(int i=l;i<=l+15;++i)ans=min(ans,f[i]);
cout
<
return0;
}
儲存儲存……
區間DP練習
部落格 lightoj 1422 int dp 105 105 a 105 dp i j i 到 j 最小穿多少衣服 int main printf d n dp 1 n return 0 poj2955括號匹配 int dp 105 105 a 105 dp i j i 到 j 匹配了多少括號。i...
數字DP練習
數字dp模板 hdu2089 不要62 題意 求區間中不含62且不含4的數的個數 include include includeusing namespace std int dp 20 10 int a 20 sta 記錄上一位數是否是6 int dfs int pos,int sta,bool ...
dp專題練習
這是一篇很水的blog 掃雷link include include include include using namespace std inline long long read while c 0 c 9 return f ans long long dp 10001 3 3 3 n,a 9...