nyoj 1111 游戏人生 【区间dp】

题目:nyoj 1111 游戏人生

题意:在一条直线上有n只狼,每只狼有自己的攻击力和辅助攻击,辅助攻击对旁边的两只狼有,问怎样的一个杀怪顺序才能使得花费最小。

分析:这是北京现场赛的题目,当时一眼看出来是区间dp,但是没有考虑计算一个区间之后两边的辅助攻击,也是很有没有做dp题目了。

定义:dp【i】【j】为打从区间 i -- j 的怪的伤害,然后转移方程dp【i】【j】 = min(dp【i】【j】 ,dp【i】【k-1】 + a【k】 + dp【k+1】【j】) + fu【i-1】【j+1】

一直没有考虑到后面加的一部分,所以代码就很好写了。

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 350
int dp[N][N];
int b[N],a[N];
int main()
{
    int n,T;
    scanf("%d",&T);
    for(int cas = 1;cas<=T;cas++)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1; i<=n; i++)
            scanf("%d",&b[i]);
        b[0]=b[n+1]=0;
        memset(dp,0,sizeof(dp));
        int i,j,l,k;
		for(l = 1; l <= n; ++l)
		{
			for(i = 1; i <= n - l + 1; ++i)
			{
				j = i + l - 1;
				dp[i][j] = 2100000000;
                for(int k=i; k<=j; k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i][k-1]+a[k]+dp[k+1][j]);
                }
                dp[i][j]+=b[i-1]+b[j+1];
			}
		}
		printf("Case #%d: %d\n",cas, dp[1][n]);
    }
    return 0;
}
时间: 2024-08-27 13:53:57

nyoj 1111 游戏人生 【区间dp】的相关文章

NYOJ 1067 Compress String(区间dp)

Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her complete a complicated task-using a new compression method similar to Run Length Encoding(RLE) compress a string.Though the task is difficult, LYH is

区间dp 括号匹配 nyoj 15

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入

NOJ 1111 保险箱的密码 【大红】 [区间dp]

传送门 保险箱的密码 [大红] 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 118            测试通过 : 3  题目描述 最近sed同学设计了一套保险箱密码锁,密码锁上有依次排好的0.1数字键,保险箱密码是由0和1组成的数字串.开启这个保险箱需要正确的密码,还需要将密码锁上数字键设定为对应的0或1,而这个过程需要特定的技巧:每次变换的工作:将密码锁上连续的0.1数字串用同样数目的全0或全1数

NYOJ 737 石子合并(一) (区间DP+平行四边形优化)

题目地址:NYOJ 737 定义状态dp [ i ] [ j ]为从第i个石子到第j个石子的合并最小代价. 没有优化的代码如下:耗时248ms. #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include

区间DP [NYOJ 536] 开心的mdd

开心的mdd 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 himdd有一天闲着无聊,随手拿了一本书,随手翻到一页,上面描述了一个神奇的问题,貌似是一个和矩阵有关的东西. 给出三个矩阵和其行列A1(10*100),A2(100*5),A3(5*50).现在himdd要算出计算矩阵所要的乘法次数,他发现不同的计算次序,所要的乘法次数也不一样, 如: (A1*A2)*A3 : 10*100*5+5*10*50=7500; A1*(A2*A3) : 5*100*50+1

区间DP [NYOJ 737] 石子合并(一)

石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入 有多组测试数据,输入到文件结束.每组测试数据第一行有一个整数n,表示有n堆石子.接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出 输出总代价的最小值,占单

nyoj 737 石子合并(一)。区间dp

http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你把[i, j]合成一堆的那一步的时候,花费肯定就是sum[i....j] 可以用纸模拟下. 那么我们设dp[i][j]表示把i...j堆合成一堆的时候的最小花费. 比如dp[1][1] = 0.dp[1][2] = a[1] + a[2]; 那么要求dp[i][j],则可以是dp[i][k] + d

nyoj 737 石子合并(区间DP)

737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No通过数:28 提交数:35 难度:3 题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入描述: 有多组测试数据,输入到文件结束. 每组测试数据第一行有一个整数n,表示有n堆石子. 接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空

合并石子 区间dp水题

合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. tags:最基本的区间dp,这题范围小,如果n大一些,还是要加个平行四边行优化. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g