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 ...
随机推荐
- 【数据库-Azure SQL Database】SQL Server 如何将数据库备份到 Azure Storage
打开本地的 SQL Server Management Studio.首先创建 Credentials.命令如下: IF NOT EXISTS (SELECT * FROM sys.credent ...
- X11/extensions/XShm.h: No such file or directory
CentOS 编译一些开源项目提示:X11/extensions/XShm.h: No such file or directory. 运行命令:yum install libXext-devel就可 ...
- 怎样将英文版的Eclipse转为中文版的?
=====>1.打开eclipse储存文件夹 =====>2.在eclipse文件中找到dropins文件 =====>3.把已经下载好的eclipse汉化包复制到dropins中 ...
- leetcode_1048. Longest String Chain_[DP,动态规划,记忆化搜索]
1048. Longest String Chain https://leetcode.com/problems/longest-string-chain/ Let's say word1 is a ...
- IOS音频视频
视频播放 MediaPlayer.framework MPMoviePlayerViewController VS MPMoviePlayerController MPMoviePlayerViewC ...
- PLSQL练习-数据共享与整合技术
1.编写一个存储过程,根据输入的工作类型,输出该工作的平均工资. 命令如下: 创建存储过程: create or replace procedure avgsal(v_job in emp.job%t ...
- 解决Genymotion2.8.1在拖动安装APK文件出现ARMtranslate错误
转载文章:http://blog.csdn.net/solo_talk/article/details/68488129 在新版本的genymotion中,我们拖动安装APK文件的时候会出现一个问题, ...
- struct结构体内存大小
一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长 ...
- Clover KextsToPatch 使用方法 2015.10.21
Clover KextsToPatch 使用方法 2015.10.21 前些天,因为 Thinkpad X230 BIOS 白名单限制,给她换了一块 ar9285 无线网卡,只是因为这块网卡正好可 ...
- The Three Day
函数基础-练习 #.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 # def modify_file(filename,old,new): # import os # w ...