【动态规划】ZZNU-OJ- 2054 : 油田
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 : 油田的更多相关文章
- 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 ...
- [动态规划] uestc oj A - 男神的礼物
A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Lweb学长 ...
- SDUT OJ 2054 双向链表的实现 (结构体node指针+遍历 *【模板】)
双向链表 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- Leetcode OJ : Triangle 动态规划 python solution
Total Accepted: 31557 Total Submissions: 116793 Given a triangle, find the minimum path sum from ...
- 题解西电OJ (Problem 1005 -跳舞毯)--动态规划
Description zyf不小心得了一种怪病,为了维持一天的精力他必须不停跳动.于是他买了一条跳舞毯,每天跳上几小时.众所周知,跳舞毯是给定一个序列,让你在指定时间踏指定的按钮,但zyf似乎不怎么 ...
- 题解西电OJ (Problem 1003 -最喜欢的数字)--动态规划
Description zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变 成1,并为此得意不已.他会且仅会的两种手段是: 1.把某个数m除以某个质数p——当然p必须能整除这个数,即 ...
- 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划
题目链接 : http://acm.xidian.edu.cn/land/problem/detail?problem_id=1006 Description wm最近喜欢上一种无聊的转盘解锁游戏,他 ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
随机推荐
- 【GStreamer开发】GStreamer基础教程01——Hello World
目标 对于一个软件库来说,没有比在屏幕上打印出Hello World更近直观的第一印象了.因为我们是在和一个多媒体的framework打交道,所以我们准备播放一段视频来代替Hello World.不要 ...
- 构建Springboot项目的3种方式
一.自己创建: 1.创建maven项目 2.pom.xml添加如下内容: <!--1.指定依赖都由springboot管理--> <parent> <groupId> ...
- LeetCode 145. 二叉树的后序遍历(Binary Tree Postorder Traversal)
145. 二叉树的后序遍历 145. Binary Tree Postorder Traversal 题目描述 给定一个二叉树,返回它的 后序 遍历. LeetCode145. Binary Tree ...
- [转帖]Red Hat K8s 关键人物 Grant Shipley 跳槽到 VMware
Red Hat K8s 关键人物 Grant Shipley 跳槽到 VMware https://news.cnblogs.com/n/641944/ 这四小时的工作效率 太无敌了.. 投递人 ...
- golang之文件结尾错误(EOF)
函数经常会返回多种错误,这对终端用户来说可能会很有趣,但对程序而言,这使得情况变得复杂.很多时候,程序必须根据错误类型,作出不同的响应.让我们考虑这样一个例子:从文件中读取n个字节.如果n等于文件的长 ...
- EXCEL 快捷键大全
1.ctrl+tab :快速切换已打开的excel/ppt/word同样适用 2.shift+右上角的× :关闭所有excel/ppt/word 3.ctrl+d:快速复制非文本目标,对于文本是删除 ...
- 03 python 对象笔记
类的命名方法 1.使用大驼峰命名法:每一个单词的首字母大写(第一个的也要)2.单词之间不需要下划线 对象的内置函数和属性 1.使用dir()函数来获取对象的内置方法和属性.返回值是一个列表.2.返回中 ...
- 2019牛客暑期多校训练营(第四场)A meeting(dfs或dp,dp待更新)
示例1: 输入: 4 21 23 13 42 4 输出:2 说明: They can meet at place 1 or 3. 题意:从K个点到达不联通图某个点需要的最短时间,这个最短时间是这K个人 ...
- 根据IP获取国家,市区,经纬度等的免费库
https://dev.maxmind.com/geoip/geoip2/geolite2/ 此网站上有提供SDK版,访问在线服务,也有离线版,下载库到本地,使用相应语言解析库
- go String接口方法
该接口经常用于输出 struct 的值 或者记录struct数据日志 一个普遍存在的接口是 fmt 包中定义的 Stringer接口 发现 http://tour.studygolang.com/me ...