SDUT 1304-取数字问题(DFS)

取数字问题

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给定M×N的矩阵,其中的每个元素都是-10到10之间的整数。你的任务是从左上角(1,1)走到右下角(M,N),每一步只能够向右或者向下,并且不能够走出矩阵的范围。你所经过的方格里面的数字都必须被选取,请找出一条最合适的道路,使得在路上被选取的数字之和是尽可能小的正整数。

输入

输入第1行是两个整数M和N,(2<=M<=10,2<=N<=10),分别表示矩阵的行和列的数目。接下来M行,每行包括N个整数,就是矩阵中的每一行的N个元素。

输出

输出只有一行,就是一个整数,表示所选道路上数字之和所能达到的最小正整数。如果不能达到任何正整数,输出-1。

示例输入

2 2
0 2
1 0

示例输出

1
简单暴搜。。
数据太弱。。几乎不用剪枝。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <cctype>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
#define ll long long
const int maxn = 11;
const int INF = 0x3f3f3f3f;
int ans, m, n, ma[11][11];
void dfs(int x, int y, int sum)
{
	if (sum > ans) {
		return ;
	}

	if (x == n && y == m) {
		if (sum > 0 && ans > sum) {
			ans = sum;
		}

		return ;
	}

	if (x < n) {
		dfs(x + 1, y, sum + ma[x + 1][y]);
	}

	if (y < m) {
		dfs(x, y + 1, sum + ma[x][y + 1]);
	}

}
int main()
{

	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
			scanf("%d", &ma[i][j]);
		}

	ans = INF;
	dfs(1, 1, ma[1][1]);

	if (ans != INF) {
		printf("%d\n", ans);
	} else {
		puts("-1");
	}

	return 0;
}

时间: 2024-10-20 20:27:05

SDUT 1304-取数字问题(DFS)的相关文章

SDUT OJ 1704 数字统计问题

SDUT OJ 1704 数字统计问题 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40930259 昨天晚上学弟问了OJ上这个题,群里说不清楚,就写个解题报告吧. 题目大意: 中文题目,就不翻译了-.- 解题思路: 不知道算不算一个典型的数位DP,反正有点那个意思,感觉确实也可以用记忆话搜索,两个差不多的意思. 我找了一下,这个问题好像是算法设计与实验题解上面的一道题,别的OJ上没有,所以就在自己OJ上做了. 大体的思路

js传统方式取数字

为啥要用正则?!我最开始也不是很理解,说实话也懒得学,但看看下面的if else 估计各位也是够了,虽然正则难学,难记总归类似这种操作应该是用正则去做的.下面我用传统字符串操作做一个取数字的函数. //函数findNum的任务 是找到字符串"1212 21 009 090 00"并打印出来 var str="1212dasdad21jif009fajf090adv00"; function findNum(str){ var arr=[];//空数组一会儿存放变量:

Codeforces 455A Boredom 取数字的dp

题目链接:点击打开链接 给定一个n长的序列 删除x这个数就能获得x * x的个数 的分数,然后x+1和x-1这2个数会消失,即无法获得这2个数的分数 问最高得分. 先统计每个数出现的次数,然后dp一下,对于每个数只有取或不取2种状态. #include <algorithm> #include <cctype> #include <cassert> #include <cstdio> #include <cstring> #include <

python取数字、字母

python取数字.字母 有一串字符串"lxa7YzU",其中有大写字母.小写字母和数字,现编写一脚本使得实现以下功能: 将这串字符串中的数字.大写字母.小写字母分别取出来并进行分类. 脚本如下所示: Zifuchuan = "lxa7YzU" Digit = "" ; Lower = "" ; Upper = "" for i in Zifuchuan : if i.isdigit() : Digit +

蓝桥杯 - 数字排列(今有7对数字) - [DFS]

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行.要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的. 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的. 注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等. 答案: 74151643752362 解法1: 按照n=1~7进行DFS:我们每次尝试在当前存在的若干空位

POJ 1426 Find The Multiple(大数取模)【DFS】||【BFS】

<题目链接> 题目大意: 给一个小于200的正整数n,问只有0和1组成的位数小于100的最小能被n整除的数是多少. 解题分析: 用DFS或者BFS沿着位数进行搜索,每一次搜索到下一位都有两种情况,0或者1,还要注意的是,大数取模的方法.但是我有一个疑问,这题位数最高为100,用dfs为什么不会超时?还是说只是此题数据太弱吗? BFS解法 #include<iostream> #include<cstdio> #include<queue> #include&

HDU 1172 猜数字(DFS)

猜数字 Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么.每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上.比如计算机随机产生的数字为1122.如果玩家猜1234,因为1,2这两个数字同时存在于这两个

SDUT 1265-马拦过河卒(DFS)

马拦过河卒 Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒".棋盘用坐标表示,A点(0,0).B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固

BZOJ 1853 SCOI2010 幸运数字 容斥原理+DFS

题目大意:求[l,r]区间内有多少个数是只由6和8组成的数的倍数 同2393 链接:http://blog.csdn.net/popoqqq/article/details/41807333 此题数据强力了一些 由于r<=10^10 所以计算LCM的时候会爆long long 于是我们可以用double求出LCM的近似值与r进行比较 如果小于r再取精确值进行计算 此外就是搜索的时候要从大到小搜 从小到大会TLE #include <cstdio> #include <cstring

取数字的个位数十位数百位数等

Python算术运算符以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200 / 除 - x除以y b / a 输出结果 2 % 取模 - 返回除法的余数 b % a 输出结果 0 ** 幂 - 返回x的y次幂 a**b 为10的20次方, 输出结果 1000000000000000