【动态规划】Gym - 101147H - Commandos

裸dp,看代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int T,f[12][12][12],n,a[12][12][12];
int main()
{
	freopen("commandos.in","r",stdin);
	int F,x,y,z;
	scanf("%d",&T);
	for(;T;--T)
	  {
	  	memset(a,0,sizeof(a));
	  	memset(f,0,sizeof(f));
	  	scanf("%d",&n);
	  	for(int i=1;i<=n;++i)
	  	  {
	  	  	scanf("%d%d%d%d",&F,&x,&y,&z);
	  	  	a[F][x][y]=z;
	  	  }
	  	for(int i=10;i>=1;--i)
	  	  for(int j=1;j<=10;++j)
	  	    for(int k=1;k<=10;++k)
	  	      {
	  	      	if(i!=10)
	  	      	  f[i][j][k]=max(f[i][j][k],f[i+1][j][k]);
	  	      	if(j!=1)
	  	      	  f[i][j][k]=max(f[i][j][k],f[i][j-1][k]);
	  	      	if(k!=1)
	  	      	  f[i][j][k]=max(f[i][j][k],f[i][j][k-1]);
	  	      	f[i][j][k]+=a[i][j][k];
	  	      }
	  	printf("%d\n",f[1][10][10]);
	  }
	return 0;
}
时间: 2024-10-22 05:35:27

【动态规划】Gym - 101147H - Commandos的相关文章

【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs&#39; Box Boutique

给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排序. 如果前面的宽大于等于后面的宽,就连接一条边. 形成一张DAG,拓扑排序后跑最长路即可. #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespa

Gym 100829S_surf 动态规划的优化

题目大意是,非你若干个任务,任务分别对应开始时间.预期收益.持续时间三项指标,让你从中选择一个受益最大的方案(没有开始时间相同的任务). 于是,标准状态转移方程应当为,设DP[K]为选择了前K个任务的最大收益,后面转移为DP[K+1]=MAX且能够共存的(DP[I]):很容易想到N^2的暴力更新,但是这题数量太大,会炸得连渣都不剩.于是需要优化到较低的数量级(比如NLOGN) 注意到,我们也许不用对某个任务来选取前K个的最大值,不容易想到优化但是想想刘汝佳同志的话--不方便直接求解的时候想想更新

Codeforces Gym 101623A - 动态规划

题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分. 我们将这个序列排序,对于权值相同的一段数可以任意交换它们,每两个相邻数在原序列的位置中如果是$i, i + 1$,那么划分的段数就可以减少1. 每次转移我们考虑添加值相同的一段. 每次转移能不能将减少的段数加一取决于当前考虑的数在前一段内有没有出现以及有没有作为最左端点. 因此我们记录一个决策与

【动态规划】Gym - 100507G - The Debut Album

一般思路的dp是用f(i,j,0)表示前i位最后有j个1的方案数,用f(i,j,1)表示前j位最后有j个2的方案数,j都是大于等于1的,然后比较容易转移. 但这题卡内存,就只能用f(i,j)表示前i位最后有j个1的方案数,这里j大于等于0. 然后转移就略麻烦,自己看代码领会一下吧. 也可以看成是滚动数组优化. #include<cstdio> using namespace std; #define MOD 1000000007 int n,lim[2]; int f[50010][310],

【动态规划】Gym - 101102A - Coins

Hasan and Bahosain want to buy a new video game, they want to share the expenses. Hasan has a set of N coins and Bahosain has a set of M coins. The video game costs W JDs. Find the number of ways in which they can pay exactly W JDs such that the diff

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

CodeForces Gym 100935D Enormous Carpet 快速幂取模

Enormous Carpet Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 100935D Description standard input/outputStatements Ameer is an upcoming and pretty talented problem solver who loves to solve problems using computers.