codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
来源:互联网 发布:c语言实训步骤怎么写 编辑:程序博客网 时间:2024/09/21 06:17
题目链接:
codeforces 453B
题目大意:
给出一个序列a,求取一个序列b,b序列的数两两互质,问能够导致
题目分析:
- 定义状态dp[i][j]表示前i个数达到j状态的最小的结果,j状态表示已经被用过的质数。
- 因为当一个a的数据范围不超过30,所以如果某个数超过60,那么选择1一定比它更优,所以我们能够用到的数的质因子也一定不会超过60,也才17个,所以我们只需要每次枚举数,然后通过之前的状态进行转移即可。
- 具体转移过程见代码。
- 为了得到方案,我们记录了pre[i][j]代表前i个数达到状态j得到最大值的前一个状态,num[i][j]表示前i个数达到状态j得到最大值的最后选取的数字。
AC代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <cstring>#define MAX 107using namespace std;int n,a[MAX];int dp[107][1<<17];int pre[107][1<<17];int num[107][1<<17];int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,53};int state[60];void print ( int i ,int u ){ if ( i == 1 ) { printf ( "%d " , num[i][u] ); return; } print ( i-1 , pre[i][u] ); printf ( "%d " , num[i][u] );}int main ( ){ while ( ~scanf ( "%d" , &n ) ) { for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &a[i] ); memset ( dp , 0x3f , sizeof ( dp ) ); int INF = dp[0][0]; dp[0][0] = 0; memset ( state , 0 , sizeof ( state ) ); for ( int i = 2 ; i < 60 ; i ++ ) for ( int j = 0; j < 17 ; j++ ) if ( i%prime[j] == 0 ) state[i] |= (1<<j); int total = 1<<17; for ( int i = 0 ; i < n ; i++ ) for ( int j = 0 ; j < total ; j++ ) { if ( dp[i][j] == INF ) continue; for ( int k = 1 ; k < 59 ; k++ ) { if ( state[k]&j ) continue; int x = state[k]|j; if ( dp[i+1][x] > dp[i][j] + abs ( a[i+1] - k ) ) { dp[i+1][x] = dp[i][j] + abs ( a[i+1] - k ); pre[i+1][x] = j; num[i+1][x] = k; } } } int ans = INF,loc = -1; for ( int i = 0 ; i < total ; i++ ) if ( ans > dp[n][i] ) { ans = dp[n][i]; loc = i; } print ( n , loc ); puts (""); }}
0 0
- codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
- Codeforces 453B 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 453 B Little Pony and Harmony Chest (状压dp)
- 【DP】 codeforces 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(状压)
- CodeForces 453B Little Pony and Harmony Chest
- codeforces 453B Little Pony and Harmony Chest (离散化+dp状态压缩)
- Codeforces Round #259 (Div. 1) B. Little Pony and Harmony Chest(状压dp)
- Codeforces 453 B Little Pony and Harmony Chest(Round 259 div.1 B/div.2 D)
- codeforce 453B - Little Pony and Harmony Chest
- CF 453B Little Pony and Harmony Chest 解题报告(状态压缩DP)
- Codeforces 454D Little Pony and Harmony Chest 状压DP
- CF 453B(Little Pony and Harmony Chest-数列最小加减1更改方案,满足任意2数互质-位运算dp+最坏情况分析+记忆化搜索)
- HDU 1250 Hat's Fibonacci(高精度)
- C#学习日记05---数据类型 之 布尔类型
- 【C++】c++日期类Date
- JSP/Servlet 工作原理
- 字典学习方法—K-SVD
- codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
- JPA主键生成策略
- equals ()与 hashcode() 与 == 解析
- 黑马程序员——Java基础---IO(二)--File类、Properties类、打印流、序列流、其他类
- 滴滴出行2016年校招笔试题整理
- HDU 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你(水~)
- 连接池4:动态代理
- anddroid一些常用属性说明
- JAVA中生成随机数