i秒时第j个机器人走k次(1<=k<=p)
f[=max(f[,f[i-k]-pay[st]+sum)
这里是从当前点倒推
st是上一个点
当st=0,st=n
sum要一遍遍加上钱k秒第st路上的金币数
每次减去第st条道路(即第st个工厂机器人)的价格
如果i-k<0
直接退出k循环,时间不为负
【代码】
#include
#include
#include
using namespace std;
int n,m,p,b[1001],a[1001][1001],f[1001];
int main
scanf(“%d%d%d“,&n,&m,&p);
memset(f,-1000000,sizeof(f)); f[0]=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf(“%d“,&a[[j]);
for(int i=1;i<=n;i++) scanf(“%d“,&b[);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
int t=j-1;
if(!t) t=n;
int ss=a[t][;
for(int k=1;k<=p;k++)
if(i-k<0) break;
f[=max(f[,f[i-k]+ss-b[t]);
t--;
if(!t) t=n;
ss+=a[t][i-k];
}
printf(“%d“,f[m]);
return 0;
【数据范围】
对于 40%的数据,2≤n≤40,1≤m≤40。
对于 90%的数据,2≤n≤200,1≤m≤200。
对于 100%的数据,2≤n≤1000,1≤m≤1000,1≤p≤m。
【做法说明】
题目呢,比较长,信息比较多,注意不要看错题。但是呢还是比较轻易可以看出这是dp题的类型。
dp[[j]表示时间i在j点的最大收益,pre[j]表示j点的上一个,mx[表示在时间i所有位置的最大收益(因为买机器人是任意位置可买,转移时直接用即可),g[[j]表示状态(i,j)取最优解时走的步数(这个明显是越小越好啦),最后输出max(dp[m][)。
王老师说:“高中驾驶学科奥赛,要更多地运用到数学与信息学的知识,请大家有机会课外都多补一补这方面的知识。”
沈笑夫心里一阵咯噔,数学和信息学,要加油啊!
这时,坐在旁边的一个男生对沈笑夫说:“沈笑夫,我是汽车三班的刘李阳,请多关照!”
沈笑夫侧目一看,这个男生脸色白净,头发新潮,一脸虔诚地看着自己。
沈笑夫点点头说:“互相关照!”
“有你这个大佬罩着,我心里有谱了,呵呵!”刘李阳笑着说。
……
下课后,沈笑夫眼前出现了驾驶学科奥赛系统显示屏:
学科: l1,288/1000
体能: l1,97/100
情绪: l1,89/100
任务: 0
奖励:奖励记忆胶囊一粒。请点击“兑奖”键领取奖励。
学科、奖励栏的背景亮着光,说明这两项有了变化!其他栏目背景灰暗,说明没有变化。
学科栏从284到288,增加了4个点,是这几天学习驾驶学科知识的收获。
奖励栏再次出现久违的记忆胶囊!
沈笑夫有些鸡冻,轻轻点击“兑奖”键,屏幕里立马滚出一粒蓝色的记忆胶囊!
好!
记忆胶囊在手,复杂的信息学,也就容易了!
麻烦的数学,也不会那么麻烦了!
沈笑夫嘴角露出了开森的笑容!
=>>(本章未完,请点击下一页继续阅读)