2054 : 油田

(一个神奇的功能:点击上方文字进入相应页面)

时间限制:1 Sec 内存限制:32 MiB
提交:49 答案正确:6

提交 状态 讨论区

题目描述

在太平洋的一片海域,发现了大量的油田!

为了方便开采这些能源,人们将这些油田从1到n进行编号,

人们在开采这些油田时,有三种开采方式,分别为方式A,方式B,方式C。

用不同的方式去开采这些油田所消耗的资金不同,为了防止共振导致的油井坍塌,相邻编号的油田不能使用同一种开采方式。

我们希望你求出开采这n个油田所需要消耗的最小资金,并输出开采每个油田所采用的方式。

输入

先输入一个整数T(0 < T <= 100),代表有T组测试数据。对于每组数据,第一行输入一个正整数n(n<1000)代表油田数目,

接下来n行,每一行包含三个整数。第i(2 <= i <= n+1)行的这三个数代表着开采编号为i-1的油田分别采用A,B,C三种方式开采所消耗的资金。

输出

对于每一组测试样本,先输出样本编号,接下来输出一个整数,代表着开采这n个油田所需要消耗的最小资金,然后按编号从小到大的顺序输出开采每个油田所采用的方式。每一组测试样本的输出占一行。

样例输入

复制
1
2
4 8 3
2 1 4

样例输出

复制
Case 1: 4 CB

提示

看着像是搜索题目,但是时间复杂度太大了,最坏的情况会严重超时!如下:

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define N 1009
const int inf=0x3f3f3f3f;
int ans,n,tem[N],road[N],cost[N][]; //tem中 1A ,2B ,3C
void factroad()
{
int i,j,k;
for(i=;i<=n;i++)
road[i]=tem[i];
return ;
} void dfs(int sum,int step) //step表示当前!
{
if(step==n+)
{
if(ans>sum)
{
ans=sum;factroad();
}
return ;
}
for(int i=;i<=;i++) //当前step的三种选择
{
if(i!=tem[step-])
{
tem[step]=i;
dfs(sum+cost[step][i],step+);
}
}
} int main()
{
int i,j,k,m,T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
//memset(vis,0,sizeof(vis));
for(i=;i<=n;i++)
scanf("%d%d%d",&cost[i][],&cost[i][],&cost[i][]);
ans=inf;
dfs(,);
printf("Case %d: %d ",++cas,ans);
for(i=;i<=n;i++)
printf("%c",'A'+road[i]-);
printf("\n");
} return ;
}

该题正解,如下:

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define N 1009
const int inf=0x3f3f3f3f;
int sum; //保存最终最小和
int ans[N]; //ans数组记录最优答案路径
int n,c[N][]; // c数组中c[i][j]表示第i个油田的第j种开采方式的花费
int dp[N][]; //dp数组用于动态规划查找最优解;
//dp[i][j]表示第i个油田采用第j种开采方式时,整个1--i个油田需要的最小开销总和
int pre[N][]; //pre前缀数组用于保存dp过程中的路径 void fact(int x,int y) //输出路径到ans数组里
{
sum=dp[x][y];
while(x>=)
{
ans[x-]=pre[x][y];
y=pre[x][y];
x--;
}
}
void test(int n){ //简单的调试函数
/* for(int i=1;i<=n;i++)
printf("%3d",i);
printf("\n");*/
for(int i=;i<=n;i++)
{
printf("i%d: ",i);
for(int j=;j<=n;j++)
printf("%3d",dp[i][j]);
printf("\n");
}
}
int main()
{
int i,j,k,m,T,cas=;
scanf("%d",&T);
while(T--)
{
memset(c,,sizeof(c)); //这里很重要,C++里数组不赋初值!在下面程序中会访问到c[n+1][]数组里的数
scanf("%d",&n);
//memset(vis,0,sizeof(vis));
for(i=;i<=n;i++)
scanf("%d%d%d",&c[i][],&c[i][],&c[i][]);
memset(dp,,sizeof(dp)); //dp[0][]数组里的数会用到 for(i=;i<=n+;i++)
{
for(j=;j<=;j++) //
{
if(j==)
{
dp[i][j]=c[i][j]+min(dp[i-][],dp[i-][]);
if(dp[i-][]>dp[i-][]) //记录路径,这个没法同上一步用min()
pre[i][j]=; //这里歪打正着了,存在相等时要选择编号小的记录入路径,不然会出错
else
pre[i][j]=; }
else if(j==)
{
dp[i][j]=c[i][j]+min(dp[i-][],dp[i-][]);
if(dp[i-][]>dp[i-][])
pre[i][j]=;
else
pre[i][j]=;
}
else
{
dp[i][j]=c[i][j]+min(dp[i-][],dp[i-][]);
if(dp[i-][]>dp[i-][])
pre[i][j]=;
else
pre[i][j]=;
}
}
} int minn=min(dp[n+][],min(dp[n+][],dp[n+][])); //找到最小值
if(minn==dp[n+][])
fact(n+,);
else if(minn==dp[n+][])
fact(n+,);
else
fact(n+,);
printf("Case %d: %d ",++cas,sum);
for(i=;i<=n;i++)
printf("%c",ans[i]+'A'-);
printf("\n");
// test(n);
} return ;
}

【动态规划】ZZNU-OJ- 2054 : 油田的更多相关文章

  1. ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】

    2080 : A+B or A-B(点击左侧标题进入zznu原题页面) 时间限制:1 Sec 内存限制:0 MiB提交:8 答案正确:3 提交 状态 讨论区 题目描述 Give you three s ...

  2. [动态规划] uestc oj A - 男神的礼物

    A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Lweb学长 ...

  3. SDUT OJ 2054 双向链表的实现 (结构体node指针+遍历 *【模板】)

    双向链表 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内 ...

  4. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  5. Leetcode OJ : Triangle 动态规划 python solution

    Total Accepted: 31557 Total Submissions: 116793     Given a triangle, find the minimum path sum from ...

  6. 题解西电OJ (Problem 1005 -跳舞毯)--动态规划

    Description zyf不小心得了一种怪病,为了维持一天的精力他必须不停跳动.于是他买了一条跳舞毯,每天跳上几小时.众所周知,跳舞毯是给定一个序列,让你在指定时间踏指定的按钮,但zyf似乎不怎么 ...

  7. 题解西电OJ (Problem 1003 -最喜欢的数字)--动态规划

    Description zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变 成1,并为此得意不已.他会且仅会的两种手段是: 1.把某个数m除以某个质数p——当然p必须能整除这个数,即 ...

  8. 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划

    题目链接 : http://acm.xidian.edu.cn/land/problem/detail?problem_id=1006 Description wm最近喜欢上一种无聊的转盘解锁游戏,他 ...

  9. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

随机推荐

  1. VC.DNS解析(winsock)

    1.尝试了 gethostbyname(...) 和 Qt598中的qhostinfo::fromname(...),都可以解析出来IP,但是有一个问题:域名指向的IP改变了,这两种方式需要等较长时间 ...

  2. js复制json对象

    var newJson = JSON.parse(JSON.stringify(json对象));

  3. 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】

    本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...

  4. LeetCode 637. 二叉树的层平均值(Average of Levels in Binary Tree)

    637. 二叉树的层平均值 637. Average of Levels in Binary Tree LeetCode637. Average of Levels in Binary Tree 题目 ...

  5. Quartz.Net—IJob特性

    IJob默认情况下是无状态的,和其他系统没有关系  特别是job里面的jobdata每次都是新的.可以无限扩展. PersistJobDataAfterExecution JobData持久化 Job ...

  6. PHP 生成公钥私钥,加密解密,签名验签

    test_encry.php <?php //创建私钥,公钥 //create_key(); //要加密内容 $str = "test_str"; //加密 $encrypt ...

  7. Spring Boot集成Junit测试

    添加依赖: 在测试类上添加注解:

  8. babel tsc webpack

    我要用啥?js的话:babel编译+webpack模块打包ts的话:tsc编译成js+babel编译+webpack模块打包浏览器情况:如果您的浏览器支持es6所有语法那么就可以只用webpack来处 ...

  9. js实现CheckBox全选或者不全选

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...

  10. [NOIP11.1模拟赛]补番报告

    Preface 昨天开始补某科学的超电磁炮S 感觉今天就好了点,炮姐赛高 T1 一开始一直想欧拉定理&ex欧拉定理,结果估计70分,数组开小了GG,看了正解发现是我学傻了 T2 一看就是数据结 ...