hdu 5691 Sitting in Line
Sitting in Line
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 293 Accepted Submission(s): 143
每组测试数据将以如下格式从标准输入读入:
N
a1p1
a2p2
:
aNPN
第一行,整数 N(1≤N≤16),代表参与游戏的整数的个数。
从第二行到第 (N+1) 行,每行两个整数,ai(−10000≤ai≤10000)、pi(pi=−1 或 0≤pi<N),以空格分割。ai代表参与游戏的数字的值,pi代表度度熊为该数字指定的位置,如果pi=−1,代表该数字的位置不被限制。度度熊保证不会为两个数字指定相同的位置。
第二行输出数字重新排列后最大的所有相邻两数乘积的和,即max{a1⋅a2+a2⋅a3+......+aN−1⋅aN}。
6
-1 0
2 1
-3 2
4 3
-5 4
6 5
5
40 -1
50 -1
30 -1
20 -1
10 -1
-70
Case #2:
4600
状压dp,比赛时没时间思考了。。。
其实,观察所要求的max{a1⋅a2+a2⋅a3+......+aN−1⋅aN}
可以发现,你发完前 i - 1 位 元素后,准备放第 i 位 元素时,当前的 max 只 与 a[i-1] 有关了 (a[i - 1] * a[i]),所以可以用状压dp
定义 dp[o][i] 为放完第i位(以a[i] 为结尾),状态 o 时的max
遍历的顺序见代码
17232841 | 2016-05-21 22:22:30 | Accepted | 5691 | 1294MS | 11724K | 2946B | G++ | czy |
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- using namespace std;
- #define N 19
- #define ll long long
- ll ma;
- ll a[N];
- int p[N];
- int have[N];
- int n;
- ll dp[ ( << ) ][N];
- int tot;
- ll inf;
- vector<int> G[N];
- int cal(int x)
- {
- int ret = ;
- while(x){
- ret += (x & );
- x /= ;
- }
- return ret;
- }
- void ini()
- {
- int o;
- for(o = ;o < n;o++){
- G[o].clear();
- }
- for(o = ;o < tot;o++){
- G[ cal(o) ].push_back(o);
- }
- }
- int main()
- {
- int T;
- //freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- scanf("%d",&T);
- for(int ccnt = ;ccnt <= T;ccnt++){
- scanf("%d",&n);
- inf = (1LL << );
- ma = -inf;
- tot = ( << n);
- ini();
- int i;
- memset(have,-,sizeof(have));
- for(i = ;i < n;i++){
- scanf("%I64d%d",&a[i],&p[i]);
- if(p[i] != -){
- have[ p[i] ] = i;
- }
- }
- int o,nt;
- for(o = ;o < tot;o++){
- for(i = ;i < n;i++){
- dp[o][i] = -inf;
- }
- }
- for(i = ;i < n;i++){
- if(p[i] == || p[i] == -){ //放在第一个
- dp[ ( << i) ][i] = ;
- }
- }
- /*
- for(i = 0;i < n;i++){
- for(int j = 0;j < G[i].size();j++){
- printf(" i =%d j = %d g= %d\n",i,j,G[i][j]);
- }
- }*/
- for(i = ;i < n;i++){ //放第i位
- int sz = G[i].size();
- for(int j = ;j < sz;j++){ //遍历含有i个1的所有数
- o = G[i][j];
- for(int k = ;k < n;k++) //把第k个数放在第i位
- {
- if( o & ( << k) ) continue; //k已经放了
- if( p[k] != - && p[k] != i ) continue; //k被固定了
- if( have[i] != - && have[i] != k ) continue; //位置i被固定了
- nt = o | ( << k);
- //printf(" i = %d o = %d k = %d nt = %d\n",i,o,k,nt);
- for(int pr = ;pr < n;pr++){
- if( (o & ( << pr ) ) == ) continue; //pr不在o里
- if( dp[o][pr] == -inf ) continue;
- //printf(" i = %d o = %d k = %d nt = %d pr = %d\n",i,o,k,nt,pr);
- dp[nt][k] = max(dp[nt][k],dp[o][pr] + a[pr] * a[k]);
- }
- }
- }
- }
- /*
- for(o = 0;o < tot;o++){
- for(i = 0;i < n;i++){
- printf(" o = %d i = %d dp = %I64d\n",o,i,dp[o][i]);
- }
- }*/
- for(i = ;i < n;i++){
- ma = max(ma,dp[tot - ][i]);
- }
- printf("Case #%d:\n",ccnt);
- printf("%I64d\n",ma);
- }
- return ;
- }
hdu 5691 Sitting in Line的更多相关文章
- HDU 5691 ——Sitting in Line——————【状压动规】
Sitting in Line Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- hdu 5691 Sitting in line 状压动归
在本题中,n<=16n<=16n<=16, 不难想到可以将所选数字的编号进行状态压缩. 定义状态 dp[S][j]dp[S][j]dp[S][j],其中 SSS 代表当前所选出的所有 ...
- hdu 5691 Sitting in Line 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 题解: 和tsp用的状压差不多,就是固定了一些访问顺序. dp[i][j]表示前cnt个点中布 ...
- 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP
Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...
- HDU5691 Sitting in Line【状压DP】
HDU5691 Sitting in Line 题意: 给出\(n\)个数字,有些数字的位置固定了,现在要求把所有没固定的数字放在一个位置,使得任意相邻两个位置的数字的相乘的和最大 题解: \(n\) ...
- hdu 5691(状压DP) Sitting in Line
题目http://acm.hdu.edu.cn/showproblem.php?pid=5691 状态DP,dp[i][j],i 表示的是一种状态,这个状态指的是当前这个数取或不取,j表示的是以第j个 ...
- HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)
题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include&l ...
- hdu5691 Sitting in Line(状压dp)
1 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- 2016百度之星 初赛2A ABEF
只做了1001 1002 1005 1006.剩下2题可能以后补? http://acm.hdu.edu.cn/search.php?field=problem&key=2016%22%B0% ...
随机推荐
- 高精度A+B
#include<stdio.h> #include<string.h> int main() { int lenth1,lenth2,n,i,j,k,s; scanf(&qu ...
- Jordan 标准型的实例
将学习到什么 练习一下如何把一个矩阵化为 Jordan 标准型. 将矩阵化为 Jordan 标准型需要三步: 第一步 求出矩阵 \(A \in M_n\) 全部的特征值 \(\lambda_1,\ ...
- CPP-网络/通信:POST
BOOL PostSubmit(CString strUrl,const CString&strPara, CString&strContent){ BOOL bRet=FALSE; ...
- HITICS || 2018大作业 程序人生 Hello's P2P
摘 要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...
- spark 省份次数统计实例
//统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...
- 自己开发一个APP需要多少钱
广州APP开发公司[启汇网络]经常遇到有开发定制APP软件需求的企业,通常第一句问的就是“开发一款APP需要多少钱”,在做完客户行业的市场调查后,再了解客... 广州APP开发公司[启汇网络]经常遇到 ...
- 搭建SSI开发框架原理
Spring2.5.Struts2.Ibatis开发框架搭建(一) ssi, ibatis 一.框架下载 1.1 Struts2框架 Struts2框架发展于WebWork,现在捐献给了Apach ...
- PAT Basic 1015
1015 德才论 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其 ...
- vue.js 利用SocketCluster实现动态添加数据及排序
直接上代码 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- IOS UITest 初始化 ViewController
import XCTest @testable import UITestDemo class UITestDemoTests: XCTestCase { var homevc:HomeViewCon ...