题意:

给你一个n行m列由'#'和'.'构成的矩阵,你需要从(1,1)点走到(n,m)点,你每次只能向右或者向下走,且只能走'.'的位置。

你可以执行操作改变矩阵:

你可以选取两个点,r0,c0;r1,c1。以(r0,c0)为小矩阵左上角坐标,以(r1,c1)为小矩阵右下角坐标。你要把这个小矩阵中的所有字符反转(也就是原来是'#'的,要变成'.',原来是'.'的,要变成'#')

题解:

对于样例

3 3
.##
.#.
##.

我们可以看成反转之后的矩阵最终从(1,1)走到(n,m)的只有一条路径,不管其他点(如下,*号就是我们最终选择的路径)

3 3
.*#
.*.
#*.

那么我们就可以反转(1,1)和(2,3)这个小矩阵,或者(2,1),(2,3)这个小矩阵。(1,1)和(2,3)这个小矩阵反转的时候虽然涉及到了一些其他点(第一列所有点),但是我们最终要走的路径没有用到它,所以不用管它。

代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxn = 1e2 + 10;
const int INF = 0x3f3f3f3f;
char s[maxn][maxn];
int dp[maxn][maxn];
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%s", s[i] + 1);
}
dp[1][1] = (s[1][1] == '#');
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
if (i == 1 && j == 1)
continue;
char ch = s[i][j];
dp[i][j] = INF;
if (i > 1)
{
if (s[i - 1][j] == ch)
dp[i][j] = min(dp[i][j], dp[i - 1][j]);
else
dp[i][j] = min(dp[i][j], dp[i - 1][j] + (ch == '#'));
}
if (j > 1)
{
if (s[i][j - 1] == ch)
dp[i][j] = min(dp[i][j], dp[i][j - 1]);
else
dp[i][j] = min(dp[i][j], dp[i][j - 1] + (ch == '#'));
}
}
}
printf("%d\n", dp[n][m]);
return 0;
}

POJ - 2336 题意:

现在有m辆车在左岸,你需要用一艘船把所有车运送到右岸,每次船只能运送n辆车。船过河的时间为t(也就是一来一回所需时间2*t)。

问你把所有车运送到右岸最少是什么时候,在这个基础上给出最少运送次数(运送次数不算船从右岸返回到左岸)

题目给你m辆车到达左岸的时间点vi。

题解:

暴力转移dp,dp[i]表示把前i辆车运送到右岸之后船又回到左岸的最小时间点

dp[i]=max(dp[j],v[i]); (1<=j<=i<=n)
dp[i]+=2*t;
cnt[i]=cnt[j]+1;

代码:

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 2e3 + 10;
const int INF=0x3f3f3f3f;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int v[maxn],cnt[maxn],dp[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,t,m;
scanf("%d%d%d",&n,&t,&m);
for(int i=1;i<=m;++i)
{
scanf("%d",&v[i]);
}
for(int i=1;i<=m;++i)
{
dp[i]=INF;
for(int j=i-n;j<i;++j)
{
if(dp[i]>max(dp[j],v[i]))
{
dp[i]=max(dp[j],v[i]);
cnt[i]=cnt[j]+1;
}
}
dp[i]+=2*t;
}
printf("%d %d\n",dp[m]-t,cnt[m]);
}
return 0;
}

AtCoder - agc043_a 和 POJ - 2336 dp的更多相关文章

  1. hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)

    题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...

  2. poj 1080 dp如同LCS问题

    题目链接:http://poj.org/problem?id=1080 #include<cstdio> #include<cstring> #include<algor ...

  3. poj 1609 dp

    题目链接:http://poj.org/problem?id=1609 #include <cstdio> #include <cstring> #include <io ...

  4. POJ 1037 DP

    题目链接: http://poj.org/problem?id=1037 分析: 很有分量的一道DP题!!! (参考于:http://blog.csdn.net/sj13051180/article/ ...

  5. Jury Compromise POJ - 1015 dp (标答有误)背包思想

    题意:从 n个人里面找到m个人  每个人有两个值  d   p     满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j]  i个人中  和 ...

  6. atcoder B - Frog 2 (DP)

    B - Frog 2 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement There a ...

  7. atcoder A - Frog 1(DP)

    A - Frog 1 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement There a ...

  8. poj 1485 dp

    转自:http://www.cnblogs.com/kuangbin/archive/2011/11/12/2246407.html [题目大意] 一条公路上有n个旅馆,选出其中k个设置仓库,一个仓库 ...

  9. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

随机推荐

  1. 数组的方法some和includes

    some() 方法用于检测数组中的元素是否满足指定条件(函数提供). some() 方法会依次执行数组的每个元素: 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测. 如果没 ...

  2. SpringBoot初识日志

    SpringBoot初识日志 1.市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j- 日志门面(日志的抽象层) 日志实现 SLF4j ...

  3. JS navigator.userAgent

    var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  4. Java Mybatis快速入门之基本使用

    目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...

  5. Pycharm同时执行多个脚本文件

    Pycharm同时执行多个脚本文件 设置Pycharm使它可以同时执行多个程序 打开Pycharm 找到Run,点击确认 点击Edit Configurations 右上角Allow parallel ...

  6. 【UML】基本介绍与类图(依赖、泛化、实现、关联、聚合、组合关系)

    文章目录 UML基本介绍 UML图 UML类图 类图-依赖关系(Dependence) 类图-泛化关系(generalization) 类图-实现关系(Implementation) 类图-关联关系( ...

  7. 【Oracle】10g 11g下载路径

    现在直接点击不能下载了 要经过oracle许可才可以下载 如果嫌麻烦可以用迅雷直接下载密码是这个 一般不会动了 大家也不用帮我找回密码了 每次都改 也很麻烦的用迅雷下就不用密码了 下载也不会卡到最后 ...

  8. List使用Stream流进行集合Collection的各种运算汇总:对BigDecimal求和,某个字段的和、最大值、最小值、平均值,字段去重,过滤等

    写Java接口的朋友都知道,Java 8的更新,经常会用到过滤 list<Object> 里的数据,本文就对List使用Stream流进行集合Collection的各种运算做一个汇总! 优 ...

  9. 针对Linux系统主机,进入修复模式,解决开机报错问题

    1.让主机重启,进入开机时的内核选择界面,按e进入编辑界面 2.找到linux16那一行,将光标移动到最前面,按下End键,到这一行的末尾,然后空格 rd.break console=tty0 3.第 ...

  10. 用 UniRx 实现 Timeline 式的异步操作

      没接触 UniRx 之前,我在 Unity 中通常用 Coroutine 或 Callback 来实现异步操作.根据我的任务,一般都是去实现游戏组件的演出,比如:敌方角色图形显示后,我方角色 UI ...