第一百九十二章 道路游戏(2 / 3)

第一行 3 个正整数,n,,,意义如题目所述。

接下来的n 行,每行有个正整数,每两个整数之间用一个空格隔开,其中第 i 行描

述了 i 号马路上每个单位时间内出现的金币数量(1≤金币数量≤100),即第i行的第 j(1≤j≤)个数表示第 j 个单位时间内i号马路上出现的金币数量。

最后一行,有 n 个整数,每两个整数之间用一个空格隔开,其中第 i 个数表示在 i 号机器人工厂购买机器人需要花费的金币数量(1≤金币数量≤100)。

输出格式

共一行,包含 1 个整数,表示在 个单位时间内,扣除购买机器人花费的金币之后,小新最多能收集到多少金币。

思路

用一维数组f储存第i秒能获得的最大钱数

因为最多同时存在1个机器人

第i秒时第j个机器人走k次1altkalt

f[i]axf[i],f[ik]ay[st]+su

这里是从当前点倒推

st是上一个点

当st0,stn

su要一遍遍加上钱k秒第st路上的金币数

每次减去第st条道路(即第st个工厂机器人)的价格

如果ikalt0

直接退出k循环,时间不为负

代码

cdealtiostreaa

cdealtcstdioa

cdealtcstrga nasace std

t n,,,b[1001],a[1001][1001],f[1001]

t a

{

scanf“ddd“,aan,aa,aa

setf,1000000,sizeoff f[0]0

rt i1ialtni++nrt j1jaltj++ scanf“d“,aaa[i][j]

rt i1ialtni++ scanf“d“,aab[i]

rt i1ialti++

rt j1jaltnj++

{

t tj1

if!t tn

t ssa[t][i]

rt k1kaltk++

{

ifikalt0

eak

f[i]axf[i],f[ik]+ssb[t]

t

if!t tn

ss+a[t][ik]

}

}

rtf“d“,f[]

return 0

}

数据范围

对于 40的数据,2≤n≤40,1≤≤40。

对于 90的数据,2≤n≤200,1≤≤200。

对于 100的数据,2≤n≤1000,1≤≤1000,1≤≤。

做法说明

题目呢,比较长,信息比较多,注意不要看错题。但是呢还是比较轻易可以看出这是d题的类型。

d[i][j]表示时间i在j点的最大收益,re[j]表示j点的上一个,x[i]表示在时间i所有位置的最大收益(因为买机器人是任意位置可买,转移时直接用即可),g[i][j]表示状态i,j取最优解时走的步数(这个明显是越