NOIP2009pj道路游戏[环形DP 转移优化 二维信息]

题目描述

小新正在玩一个简单的电脑游戏。

  游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接。小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编号为1~n,因为马路是环形的,所以第 n 个机器人工厂和第 1 个机器人工厂是由一段马路连接在一起的。小新将连接机器人工厂的这 n 段马路也编号为 1~n,并规定第 i 段马路连接第 i 个机器人工厂和第 i+1 个机器人工厂(1≤i≤n-1),第 n 段马路连接第 n 个机器人工厂和第 1个机器人工厂。   游戏过程中,每个单位时间内,每段马路上都会出现一些金币,金币的数量会随着时间发生变化,即不同单位时间内同一段马路上出现的金币数量可能是不同的。小新需要机器人的帮助才能收集到马路上的金币。所需的机器人必须在机器人工厂用一些金币来购买,机器人一旦被购买,便会沿着环形马路按顺时针方向一直行走,在每个单位时间内行走一次,即从当前所在的机器人工厂到达相邻的下一个机器人工厂,并将经过的马路上的所有金币收集给小新,例如,小新在 i(1≤i≤n)号机器人工厂购买了一个机器人,这个机器人会从 i 号机器人工厂开始,顺时针在马路上行走,第一次行走会经过 i 号马路,到达 i+1 号机器人工厂(如果 i=n,机器人会到达第 1 个机器人工厂),并将 i 号马路上的所有金币收集给小新。 游戏中,环形马路上不能同时存在 2 个或者 2 个以上的机器人,并且每个机器人最多能够在环形马路上行走 p 次。小新购买机器人的同时,需要给这个机器人设定行走次数,行走次数可以为 1~p 之间的任意整数。当马路上的机器人行走完规定的次数之后会自动消失,小新必须立刻在任意一个机器人工厂中购买一个新的机器人,并给新的机器人设定新的行走次数。 以下是游戏的一些补充说明:

  1. 游戏从小新第一次购买机器人开始计时。
  2. 购买机器人和设定机器人的行走次数是瞬间完成的,不需要花费时间。
  3. 购买机器人和机器人行走是两个独立的过程,机器人行走时不能购买机器人,购买完机器人并且设定机器人行走次数之后机器人才能行走。
  4. 在同一个机器人工厂购买机器人的花费是相同的,但是在不同机器人工厂购买机器人的花费不一定相同。
  5. 购买机器人花费的金币,在游戏结束时再从小新收集的金币中扣除,所以在游戏过程中小新不用担心因金币不足,无法购买机器人而导致游戏无法进行。也因为如此,游戏结束后,收集的金币数量可能为负。 现在已知每段马路上每个单位时间内出现的金币数量和在每个机器人工厂购买机器人需要的花费,请你告诉小新,经过 m 个单位时间后,扣除购买机器人的花费,小新最多能收集到多少金币。

输入输出格式

输入格式:

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

接下来的 n 行,每行有 m 个正整数,每两个整数之间用一个空格隔开,其中第 i 行描 述了 i 号马路上每个单位时间内出现的金币数量(1≤金币数量≤100),即第 i 行的第 j(1≤j≤m)个数表示第 j 个单位时间内 i 号马路上出现的金币数量。

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

输出格式:

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

输入输出样例

输入样例#1:

2 3 2
1 2 3
2 3 4
1 2

输出样例#1:

5

说明

【数据范围】

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

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

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

NOIP 2009 普及组 第四题

------------------------------------------------------------------

一些节点组成一个环,相邻节点的道路上不同时间权值不同,机器人要花费,求最多金币

---------------------------------------------------------------------------

几个月前被虐,现在还凑合

f[i][j]表示i个时间到了节点j的最大金币数

可以枚举上一个机器人的p,维护fmx和价值和,复杂度O(n3)

考虑当前状态,可以由上一个状态走来(一定是p>1最优的),也可以新买一个,保存上一个状态的step,就可以O(1)转移了

有点像二维信息,比如vijos1392

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=1005,INF=1e9;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m,p,coin[N][N],cost[N];
int f[N][N],fmx[N],step[N][N];
inline int pre(int x){
    if(x==1) return n;
    return x-1;
}

void dp(){
    //for(int i=1;i<=n;i++) f[1][n]=coin[]
    //for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) f[i][j]=-INF,fmx[i]=-INF;
    for(int j=1;j<=n;j++)
        f[1][j]=coin[1][pre(j)]-cost[pre(j)],step[1][j]=1,fmx[1]=max(fmx[1],f[1][j]);
    for(int i=2;i<=m;i++){
        fmx[i]=-INF;
        for(int j=1;j<=n;j++){
            int pj=pre(j);
            f[i][j]=fmx[i-1]+coin[i][pj]-cost[pj];
            step[i][j]=1;
            if(step[i-1][pj]<p&&f[i][j]<f[i-1][pj]+coin[i][pj]) {
                f[i][j]=f[i-1][pj]+coin[i][pj];
                step[i][j]=step[i-1][pj]+1;
            }
            fmx[i]=max(fmx[i],f[i][j]);
        }
    }
}
int main(){
    n=read();m=read();p=read();
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) coin[j][i]=read();
    for(int i=1;i<=n;i++) cost[i]=read();
    dp();
    printf("%d",fmx[m]);
}
时间: 2024-10-13 16:51:41

NOIP2009pj道路游戏[环形DP 转移优化 二维信息]的相关文章

『进阶DP专题:二维DP初步』

<更新提示> <第一次更新> <正文> 二维动态规划 初步 二维动态规划并不是指动态规划的状态是二维的,而是指线性动态规划的拓展,由线性变为了平面,即在一个平面上做动态规划. 例题 马拦过河卒 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,A点(0, 0).B点(n, m)(n, m

小游戏●推箱子(利用二维数组制作)

利用数组制作的简单推箱子游戏 代码及简要分析如下: 1 //推箱子小游戏 2 //定义一个三维数组存放地图,三维数组由单独的二维数组组成,本游戏中只有三个地图 3 int[][,] a = new int[3][,]; 4 //用二维数组创建地图,0是空位,1是墙,2是人,3是箱子,4是终点 5 int[,] b0 = new int[10, 10]{ 6 {1,1,1,1,1,1,1,1,1,1}, 7 {1,0,0,0,1,0,1,0,0,1}, 8 {1,0,0,0,1,0,1,0,0,1

hdu----(1677)Nested Dolls(DP/LIS(二维))

Nested Dolls Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2704    Accepted Submission(s): 802 Problem Description Dilworth is the world’s most prominent collector of Russian nested dolls: he

基础DP中的二维费用的背包

二维费用的背包问题: 指对于每件物品,具有2种不用的费用,选择这件物品需要同时付出2种代价 对于每一种代价都有一个可付出的最大值(背包容量) 问怎么样选择物品可以得到最大的价值 设这2种代价分别为1,2 第i件物品所需的2种代价为a[i] , b[i] 2种代价可付出的最大值为U,V 物品价值为w[i] 费用增加了一维,则状态也增加一维 设f[u][v]表示前i件物品付出代价为u,v时的最大价值 则f[u][v]=max(f[u][v],f[u-a[i]][v-b[i]]+w[i]) 1.物品只

题解:luoguP1070 道路游戏(DP)

题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编号为1~n,因为马路是环形的,所以第 n 个机器人工厂和第 1 个机器人工厂是由一段马路连接在一起的.小新将连接机器人工厂的这 n 段马路也编号为 1~n,并规定第 i 段马路连接第 i 个机器人工厂和第 i+1 个机器人工厂(1≤i≤n-1),第 n 段马路连接第 n 个机器人工厂和第 1个机器人

HDU 3480 Division(斜率优化+二维DP)

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 3984    Accepted Submission(s): 1527 Problem Description Little D is really interested in the theorem of sets recently. There’s a pro

NOIP2003pj数字游戏[环形DP]

题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod

Vijos1392拼拼图的小衫[背包DP|二维信息DP]

背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅,有责任带领大家脱离危险! (若对情节有任何疑问,请观看原剧) 描述 歹徒告诉小杉,他正在寻找的拼图块其实可以拼成N个 有顺序的 完整的拼图. 每个完整的拼图由若干个拼图块组成. 歹徒要求小杉把拼图按拼出的顺序划分成M个集合,一个拼图集合由若干个完整的拼图组成,并且总的拼图块的数目不超过T.并且,构成集合的拼图

Swift - 25 - 控制转移和二维数组

//: Playground - noun: a place where people can play import UIKit // fallthrough // fallthrough会在当前case执行完之后继续下一个case // 如果在下一个case中声明了变量, 则不能使用fallthrough var coordinate = (1, 0) switch coordinate { case (0, 0): print("It's at origin!") fallthr