hdu 4719 動態規劃

2022-05-22 06:24:11 字數 1752 閱讀 2370

思路:dp[i]表示到第i個點為結尾能獲得的最大值,那麼dp[i]=h[i]*h[i]+dp[i-x]-h[i-x];(i-l<=x<=i);那麼我們可以轉換下,以dp[i]-h[i]為新的權值,動態方程就變成了dp[i]=dp[i-x]+h[i]*h[i](i-l<=x<=i);只要找到最大的dp[i-x]就可以了。可以用線段樹維護。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pb push_back

#define mp make_pair

#define maxn 100010

#define maxm 80002

#define ll __int64

#define abs(x) ((x)>0?(x):(-x))

#define lson(x) (x<<1)

#define rson(x) (x<<1|1)

#define inf 10000000

#define lowbit(x) (x&(-x))

#define clr(x,y) memset(x,y,sizeof(x))

#define mod 1000000007

using

namespace

std;

inth[maxn],sorted[maxn];

intr[maxn];

ll dp[maxn],ans;

struct

tree

}tree[maxn*3

];int cmp(int a,int

b)void buildtree(int l,int r,int

po)void update(int i,ll val,int

po)

int mid=tree[po].mid();

if(i<=mid)

update(i,val,lson(po));

else

update(i,val,rson(po));

tree[po].max=max(tree[lson(po)].max,tree[rson(po)].max);

}void query(int i,int

po)

int mid=tree[po].mid();

if(i<=mid)

query(i,lson(po));

else

}int

main()

for(i=1;i<=n;i++) r[i]=i;

sort(r+1,r+n+1

,cmp);

intpos[maxn];

for(i=1;i<=n;i++) pos[r[i]]=i;

buildtree(

1,n,1

);

for(i=1;i<=n;i++)

printf(

"case #%d:

",++case);

if(dp[n]<0

) printf(

"no solution\n");

else

printf(

"%i64d\n

",dp[n]);

}return0;

}

hdu2159 動態規劃

problem description 最近xhd正在玩一款叫做fate的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來公升完這最後一級。現在的問題是,xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應的...

hdu 1257 動態規劃

problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...

hdu1978動態規劃

還算比較好理解的動態規劃 題意 這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點 1,1 走到棋盤的終點 n,m 遊戲的規則描述如下 1.機械人一開始在棋盤的起始點並有起始點所標有的能量。2.機械人只能向右或者向下走,並且每走一步消耗一單位能量。3.機械人不能在原地停留。4.當機械人選擇了...