P1736 创意吃鱼法 (动态规划)
题目描述
回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*)。她发现,把大池子视为01矩阵(0表示对应位置无鱼,1表示对应位置有鱼)有助于决定吃鱼策略。
在代表池子的01矩阵中,有很多的正方形子矩阵,如果某个正方形子矩阵的某条对角线上都有鱼,且此正方形子矩阵的其他地方无鱼,猫猫就可以从这个正方形子矩阵“对角线的一端”下口,只一吸,就能把对角线上的那一队鲜鱼吸入口中。
猫猫是个贪婪的家伙,所以她想一口吃掉尽量多的鱼。请你帮猫猫计算一下,她一口下去,最多可以吃掉多少条鱼?
输入输出格式
输入格式:
有多组输入数据,每组数据:
第一行有两个整数n和m(n,m≥1),描述池塘规模。接下来的n行,每行有m个数字(非“0”即“1”)。每两个数字之间用空格隔开。
对于30%的数据,有n,m≤100
对于60%的数据,有n,m≤1000
对于100%的数据,有n,m≤2500
输出格式:
只有一个整数——猫猫一口下去可以吃掉的鱼的数量,占一行,行末有回车。
输入输出样例
4 6
0 1 0 1 0 0
0 0 1 0 1 0
1 1 0 0 0 1
0 1 1 0 1 0
3
说明
右上角的
1 0 0
0 1 0
0 0 1
Solution
一开始以为是道DP水题...
自信满满:
状态很好定义:
f [ i ] [ j ] 代表吃到 ( i , j )这个点的时候最多吃多少.
转移也很好转移,直接从左斜线和右斜线转移过来.
20分的代码:
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&c[i][j]);
f[][]=c[][];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
f[i][j]=c[i][j];
if(i>&&j>)
if(c[i][j]&&c[i-][j-])
f[i][j]=max(f[i][j],c[i][j]+f[i-][j-]);
ans=max(ans,f[i][j]);
}
memset(f,,sizeof(f));
f[][m]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
{
f[i][j]=c[i][j];
if(i>&&j<m)
if(c[i][j]&&c[i+][j-])
f[i][j]=max(f[i][j],c[i][j]+f[i+][j-]);
ans=max(ans,f[i][j]);
}
cout<<ans<<endl;
}
然后,才发现自己有几个限制没注意到...一直20分.
我一开始就有一个误区,即一开始就把所有状态混在一起.
打得心态崩溃,于是发现还需要两个数组来记录
当前这个点四周没有1的正方形的最大面积.
然后其实应该分两个情况来做才好.因为:
0 0 1
0 1 0
0 0 1
像这样的情况是不能转移的.
但是用我刚才的状态做,很坑... 所以处理两遍是最好的方式.
左斜处理一遍,右斜处理一遍.
事实证明,题目真的要仔细看...
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,m,ans;
int c[maxn][maxn],f[maxn][maxn];
int f1[maxn][maxn],f2[maxn][maxn];
int main()
{
scanf("%d%d",&n,&m);
f[][]=c[][];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
f[i][j]=c[i][j];
scanf("%d",&c[i][j]);
if(!c[i][j])
f1[i][j]=f1[i][j-]+,
f2[i][j]=f2[i-][j]+;
if(c[i][j])
f[i][j]=min(f[i-][j-],min(f1[i][j-],f2[i-][j]))+;
ans=max(ans,f[i][j]);
}
memset(f,,sizeof(f));
memset(f1,,sizeof(f1));
memset(f2,,sizeof(f2));
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
{
f[i][j]=c[i][j];
if(!c[i][j])
f1[i][j]=f1[i][j+]+,
f2[i][j]=f2[i-][j]+;
if(c[i][j])
f[i][j]=min(f[i-][j+],min(f1[i][j+],f2[i-][j]))+;
ans=max(ans,f[i][j]);
}
cout<<ans<<endl;
}
P1736 创意吃鱼法 (动态规划)的更多相关文章
- P1387 最大正方形&&P1736 创意吃鱼法
P1387 最大正方形 P1736 创意吃鱼法 两道类似的$DP$ 转移方程基本上类似于$f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))$ 考虑构成 ...
- 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷 P1736 创意吃鱼法
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...
- P1736 创意吃鱼法 图的DP
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
- P1736 创意吃鱼法80
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷 P1736 创意吃鱼法(多维DP)
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
随机推荐
- sysbench0.5安装介绍
sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况,sysbench支持MySQL.PostgreSQL.Oracle数据库OLTP测试.它 ...
- 使用prelu
一个使用方式:http://blog.csdn.net/xg123321123/article/details/52610919 还有一种是像relu那样写,我就是采用的这种方式,直接把名字从relu ...
- js 两个数组对象根据账号比较去重,解决直接splice后数组索引改变
目的获取Arr2中不包含在arr1中的对象 根据Account进行比较,如果相等则删除tempArr数组对象. 结果返回张三 var arr1=[{"account":" ...
- Bootstrap历练实例:输入框组的大小
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- SVN的配置
Xcode 是开发人员建立 Mac OS X 应用程序的最快捷方式,也是利用新的苹果电脑公司技术的最简单的途径,而SVN是版本控制工具,那么Xcode SVN又是什么呢?如何配置Xcode SVN? ...
- 初涉期望dp/概率dp【在更】
大致可以分为两种:爆精度:小数取模.
- (7)zabbix资产清单inventory管理
概述 监控的设备越来越多,有时候搞不清楚哪台服务器是什么配置,大多公司有自己的资产清单,要去专门的系统查询显得多少有点麻烦.为此,zabbix专门设置了设备资产管理功能. 我们创建或编辑主机的时候,可 ...
- Mac OS X下安装Vue脚手架(vue-cli)
前言 Vue作为前端三大框架(Angular,React,Vue)之一,号称是最简单,最容易上手的框架,同时也是行内的大趋势,还可以用来开发最火的小程序.具有开发快,双向数据流等特点,有些人认为Vue ...
- Python三元表达式和列表生成式
三元表达式 取代 if …… else……的简单表达方式 # 常规写法 x = 1 y = 2 if x>y: print(x) else: print(y) #三元表达式写法 res ...
- Python9-文件操作-day8
# 1.文件路径:d:\xxx.txt# 绝对路径:从根目录开始# 想对路径:当前文件下# 2.编码方式:utf-8/gbk...# 3.操作方式:只读.只写.追加.读写.写读..... f=open ...