codeforce 453B - Little Pony and Harmony Chest
来源:互联网 发布:心动网络2018校招 编辑:程序博客网 时间:2024/06/05 20:40
题目如下:
分析:因为ai的范围时1-30,而数组全部为1时肯定满足条件的,所以只需要找1-60内的值就够了。而另一个要求是gcd为一,也就是没有除了1以为的共同因子,那么可以先把每个数的因子求出来,已位的形式表达,两个数要是gcd为1的话,则需要两个位表达式与一下为0,如4的因子为2,我们标记2所在的那一位为1,当出现8时,8的因子也为2,而看到2所在的那位已经是1了,所以8可能不可能是合法的值了。转移方程为dp[i][j|p(k)] = min(dp[i][j|p(k)],dp[i-1][j]+abs(a[i]-k)),意思是当第i-1个数结束后状态为j的时候,在第i个位置的地方选择了数值k,那么当前的状态就是dp[i][j|p(k)], p(k)即k用位表达的值,当然进行转移的前提是p(k)&j==0,不然就不满足gcd为1的条件了,其他变量在注视中写的挺清楚了
#include <iostream>#include <map>#include <algorithm>#include <string.h>#include <stack>using namespace std;const int N=(1<<16)+10;const int INF = 999999999;int arr[110]; //记录输入int dp[110][N];//状态转移,dp[i][j]表示在第i个数状态为j的时候的最小差,这里的状态是用位表示的,比如说出现过4,那么4的因子是2,则第二位的bit变为1,之后在看后一个数和之前的状态是否满足gcd为1的条件时,只要看该数的因子位是否已经为1int f[110][N];//用来记录第i位第j个状态有没有被访问过int sol[110][N];//记录到达当前状态选用的数int trans[110][N];//记录转移到当前状态的前一个状态int n;int p[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};int getx[60];void init(){ for(int k=1;k<60;k++) { int ans = 0; int x = k; for(int i=0;i<16;i++) { if(x%p[i]==0) { ans |= (1<<i); while(x%p[i]==0) x/=p[i]; } } getx[k]=ans; }}int main(){ init(); while(cin>>n) { for(int i=1;i<=n;i++) cin>>arr[i]; memset(f,0,sizeof(f)); memset(dp,0,sizeof(dp)); f[0][0] = 1; for(int i=1;i<=n;i++) { for(int j=1;j<60;j++) { for(int k=0;k<N;k++) { if(f[i-1][k]&&(k&getx[j])==0) { int u = k|getx[j]; if(!f[i][u]) { dp[i][u] = dp[i-1][k]+abs(arr[i]-j); trans[i][u] = k; sol[i][u] = j; } else if((dp[i-1][k]+abs(arr[i]-j))<dp[i][u]) { dp[i][u] = dp[i-1][k]+abs(arr[i]-j); trans[i][u] = k; sol[i][u] = j; } f[i][u]=1; } } } } int ans = INF; int pos = 0; for(int i=0;i<N;i++) { if(f[n][i]&&dp[n][i]<ans) { ans = dp[n][i]; pos = i; } } stack<int> ou; for(int i=n;i>=1;i--) { ou.push(sol[i][pos]); pos = trans[i][pos]; } while(!ou.empty()) { cout<<ou.top()<<" "; ou.pop(); } cout<<endl; } return 0;}
0 0
- codeforce 453B - Little Pony and Harmony Chest
- codeforces 453B Little Pony and Harmony Chest
- Codeforces 453 B. Little Pony and Harmony Chest
- Codeforces 453B Little Pony and Harmony Chest 状压dp
- Codeforces 453B Little Pony and Harmony Chest(状压)
- codeforces 453 B Little Pony and Harmony Chest (状压dp)
- Codeforces 453B Little Pony and Harmony Chest 状压DP
- codeforces 453 B Little Pony and Harmony Chest (状压dp)
- CodeForces 453B Little Pony and Harmony Chest
- 【DP】 codeforces 453B Little Pony and Harmony Chest
- Codeforces 453 B Little Pony and Harmony Chest(Round 259 div.1 B/div.2 D)
- codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
- Codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
- CF 453B Little Pony and Harmony Chest 解题报告(状态压缩DP)
- codeforces 453B Little Pony and Harmony Chest (离散化+dp状态压缩)
- 【cf453B】Little Pony and Harmony Chest
- Codeforces Round #259 (Div. 1) B. Little Pony and Harmony Chest(状压dp)
- cf 状压dp Little Pony and Harmony Chest
- 剑指offer 6.3 知识迁移能力1- 数字在排序数组中出现的次数
- leetcode 刷题之路 76 Remove Duplicates from Sorted List
- VB的MSHFlexGrid控件内容导入Excel
- xunsearch的集群
- MySQL 四种字符集问题 统一
- codeforce 453B - Little Pony and Harmony Chest
- ./test.sh: 3: ./test.sh: Syntax error: "(" unexpected
- 《TCP/IP协议详解》笔记-第一章
- 我要带徒弟学架构
- Rails中delegate用法
- 2.JavaWeb基础 Tomcat
- RESTful API 设计指南
- MFC调试DOS窗口打印调试信息
- ZOJ1101