ZOJ 3802 Easy 2048 Again ( 状态压缩 )

2024-05-29 18:38
文章标签 压缩 状态 easy zoj 2048 3802

本文主要是介绍ZOJ 3802 Easy 2048 Again ( 状态压缩 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 题目链接~~>

做题感悟:这题很经典 ,需要模拟一下找规律,还是那句话遇到题自己应该手动推一下。

解题思路:

              这题如果手动推几组数据的话就应该发现 ,如果放进队列的元素是递减的话,这样才可以连续合并,如果队列中有 a  ,b , a < b 那么 a 前面的必定不会与 b 经过合并再合并,因为越合并越大,so ~> 队列中最多才存 12 个数,可以用状态压缩压缩一下。注意要用滚动数组,不用可能超时。

代码:

#include<iostream>
#include<sstream>
#include<map>
#include<cmath>
#include<fstream>
#include<queue>
#include<vector>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<bitset>
#include<ctime>
#include<string>
#include<cctype>
#include<iomanip>
#include<algorithm>
using namespace std  ;
#define INT __int64
#define L(x)  (x * 2)
#define R(x)  (x * 2 + 1)
const int INF = 0x3f3f3f3f ;
const double esp = 0.0000000001 ;
const double PI = acos(-1.0) ;
const int mod = 1000000007 ;
const int MY = (1<<13) + 5 ;
const int MX = 500 + 5 ;
const int MS = 13 ;
int n ;
int g[MX] ,dp[2][MY] ;
int main()
{int Tx ;scanf("%d" ,&Tx) ;while(Tx--){scanf("%d" ,&n) ;for(int i = 1 ;i <= n ; ++i)scanf("%d" ,&g[i]) ;memset(dp ,-1 ,sizeof(dp)) ;dp[0][0] = 0 ;for(int i = 1 ;i <= n ; ++i)for(int S = 0 ;S <= MY ; ++S)if(dp[(i-1)%2][S] != -1) // 由前一行的合法状态递推第 i 行{dp[i%2][S] = max(dp[i%2][S] ,dp[(i-1)%2][S]) ;   // 不拿int k ,key ,sum ,ret ,temp ;if(S){for(int k = 0 ;k <= 12 ; ++k)     // 计算队列中的最小的元素if(S&(1<<k)){temp = (1<<k) ;break ;}}else   temp = 0 ;if(temp < g[i])              // 无法合并dp[i%2][g[i]] = max(dp[i%2][g[i]] ,dp[(i-1)%2][S] + g[i]) ;else if(temp == g[i])  // 可以合并{key = S ; sum = g[i] ;  ret = g[i] ;while(key&ret){sum += ret*2 ;key = key - ret ;ret <<= 1 ;}dp[i%2][key+ret] = max(dp[i%2][key+ret] ,dp[(i-1)%2][S] + sum) ;}else if(temp > g[i])  // 放入队列dp[i%2][g[i] + S] = max(dp[i%2][g[i] + S] ,dp[(i-1)%2][S] + g[i]) ;}int ans = 0 ;for(int S = 0 ;S <= MY ; ++S)ans = max(ans ,dp[n%2][S]) ;printf("%d\n" ,ans) ;}return 0 ;
}



这篇关于ZOJ 3802 Easy 2048 Again ( 状态压缩 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014325

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动