jzoj 5770 可愛精靈寶貝

2021-08-22 09:59:43 字數 1628 閱讀 5112

–是區間dp(好像dfs加神秘玄學剪枝也能過?)

首先,我們可以發現這個人走過的位置是乙個區域,而且區域內部的精靈要麼被抓,要麼消失了(總之就是與以後的轉移沒有關係)

所以,狀態定義:

f[l][r][t] :當這個人走過區間[l,r],且目前在l處,時間為t時的最大分值

注意,l,r的左右位置要根據大小自己判斷

然後我們又發現,現在這個人只有兩種方法:左走或右走

他肯定是走到他沒有走過的第乙個有精靈的房子前,因為他不可能無視他(不符合貪心原則)

所以,轉移方程:

看**,有點長(因為還要判斷這個精靈能否抓到)

最後,邊界就是 :

f[起始房子][起始房子][1]=0

還有可以離散化一下,因為有很多房子前沒有精靈,其實是沒用的

排一下序,編號放進乙個陣列就行,k也要放(看成是沒有價值,時間為1的精靈)

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=105;

int n,k,m;

int a[maxn],b[maxn],t[maxn];

int w[maxn];

int maxt;

int f[maxn][maxn][2005];

int ans;

bool comp(const

int &x,const

int &y)

sort(w,w+1+m,comp);

memset(f,-1,sizeof(f));

for(int i=0;i<=m;i++)

if(a[w[i]]==k)

f[i][i][1]=0;

for(int time=1;time<=maxt;time++)

t=time+a[w[r+1]]-a[w[l]];

if(rif(t<=t[w[r+1]])

f[r+1][l][t]=max(f[r+1][l][t],f[l][r][time]+b[w[r+1]]);

else

f[r+1][l][t]=max(f[r+1][l][t],f[l][r][time]);}}

else

t=time+a[w[l+1]]-a[w[l]];

if(lif(t<=t[w[l+1]])

f[l+1][r][t]=max(f[l+1][r][t],f[l][r][time]+b[w[l+1]]);

else

f[l+1][r][t]=max(f[l+1][r][t],f[l][r][time]);}}

}ans=max(ans,f[l][r][time]);}}

}cout

0;}

577 員工獎金

選出所有 bonus 1000 的員工的 name 及其 bonus。employee 表單 bonus 表單 輸出示例 題目條件 mysql drop table ifexists bonus create table bonus empid int 11 notnull bonus int 11...

mysql 5 7 7以後需要初始化資料庫

用zip包的形式在windows上安裝了mysql 5.7.10,在啟動服務的時候,總是提示無法啟動服務,說是服務沒有報告任何錯誤。從windows的事件管理器中可以看到錯誤資訊 fatal error can t open and lock privilege tables table mysql...

JZOJ 交換 模擬

給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...