MAGRID DP

来源: http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=10907#problem/A   

ACM International Collegiate Programming Contest, Asia-Amritapuri Site, 2011

题意:有一个矩阵,要求从左上角走到右下角。每个方格里有正数或者负数。从左上角走的时候有一定的血量,走到一个方格,若该方格是负数,则需要减去该方格的血量,若是正数,则可以加上该方格的血量。若血量小于等于0,则不能继续走下去。求若想走到右下角,则从左上角出发时最少需要多少的血量。
思路:这道题我是用DP做的。不过标程是用二分做的。我的思路是:倒着DP。即从右下角向左上角Dp。到达右下角时的血量最少为1,另dp[i][j]为到达第i行第j列时能继续往下走的最少血量。则dp[i-1][j] = min(dp[i-1][j] , dp[i][j] - num[i-1][j]), dp[i][j-1] = min (dp[i][j-1], dp[i][j]  - num[i][j-1])。这样一直求上去就可以得到dp[1][1]的值。在这个过程中,有一点需要注意,若求出的某点血量为小于等于0,则应该赋值为1,这点很好理解。最后dp[1][1] = min (dp[1][2] , dp[2][1])。
代码:
#include <iostream>#include <cstdio>#include <string.h>#include <climits>using namespace std;#define CLR(arr,val) memset(arr,val,sizeof(arr))const int N = 510;int dp[N][N],num[N][N];int min(int a,int b){	return a<b ? a:b;}int main(){	//freopen("1.txt","r",stdin);	int row,col;	int numcase;	scanf("%d",&numcase);	while(numcase--){	  scanf("%d%d",&row,&col);	  CLR(num,0);	  for(int i = 1; i <= row; ++i){	    for(int j = 1; j <= col; ++j){			scanf("%d",&num[i][j]);			dp[i][j] = INT_MAX;		}	  }	  dp[row][col] = 1;	  num[1][1] = 1;	  for(int i = row; i >= 1; --i){		  for(int j = col; j >= 1; --j){			  if(i-1 > 0 && i-1 < row){				  int x = dp[i][j] - num[i-1][j];				  if(x <= 0) x = 1;				  dp[i-1][j] = min(dp[i-1][j],x);			  }			  if(j-1 > 0 && j - 1 < col){			      int x = dp[i][j] - num[i][j-1];				  if(x <= 0) x = 1;				  dp[i][j-1] = min(dp[i][j-1],x);			  }		  }	  }	  int mm = INT_MAX;      mm = min(mm,dp[1][2]);	  mm = min(mm,dp[2][1]);	  printf("%d\n",mm);	}	return 0;}


10-82 A1-1查询联系人信息 分数 20 作者 柯海丰 单位 浙大城市学院 在顾客表(customers)中找出所在城市(City)为London的公司名(CompanyName)和联系人名(ContactName) 提示:请使用SELECT语句作答。 表结构: 列名 数据类型 长度 主码 说明 CustomerID varchar 5 √ 顾客编号 CompanyName varchar 40 公司名称 ContactName varchar 30 联系姓名 ContactTitle varchar 30 联系头衔 Address varchar 60 地址 City varchar 15 城市 Region varchar 15 区域 PostalCode varchar 10 邮政编码 Country varchar 15 国家 Phone varchar 24 电话 Fax varchar 24 传真 表样例 请在这里给出上述表结构对应的表样例。例如 customers表: CustomerID CompanyName ContactName City ALFKI Alfreds Futterkiste Maria Anders Berlin ANATR Ana Trujillo Emparedados y helados Ana Trujillo Mxico D.F. ANTON Antonio Moreno Taquera Antonio Moreno Mxico D.F. AROUT Around the Horn Thomas Hardy London BERGS Berglunds snabbkp Christina Berglund Lule BLAUS Blauer See Delikatessen Hanna Moos Mannheim BLONP Blondesddsl pre et fils Frdrique Citeaux Strasbourg BOLID Blido Comidas preparadas Martn Sommer Madrid BONAP Bon app' Laurence Lebihan Marseille BOTTM Bottom-Dollar Markets Elizabeth Lincoln Tsawassen 输出样例: 请在这里给出输出样例。例如: CompanyName ContactName Around the Horn Thomas Hardy 代码长度限制 16 KB 时间限制 400 ms 数据库 MySQL 结果输出要求 严格对比顺序与数据 建表语句 结果表结构
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值