思路: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.當機械人選擇了...