Codeforces 758D Ability To Convert(区间DP)

题目链接:http://codeforces.com/problemset/problem/758/D

题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了。求k这个数对应的,在10进制下最小的数。

分析:

本质上是把数字分成若干段使得每一段 <n 且没有前导 0

dp[i] 表示前 i 个字符划分好之后能得到的最小数。

状态枚举下一段怎么切。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 typedef long long ll;
 9 const ll INF=(1LL<<62)-1;
10 char s[105];
11 ll dp[105];
12 int main()
13 {
14     int n;
15     scanf("%d%s",&n,s+1);
16     int len=strlen(s+1);
17     for(int i=0; i<=len; i++)
18         dp[i]=INF;
19     dp[0]=0;
20     for(int i=1; i<=len; i++)
21     {
22         ll now=0;
23         for(int j=i; j<=len; j++)
24         {
25             now=now*10+s[j]-‘0‘;
26             if(now>=n)break;
27             if(s[i]==‘0‘ && j>i)break;
28             if(1.0*dp[i-1]*n+now>2e18)continue;
29             dp[j]=min(dp[j],dp[i-1]*n+now);
30         }
31     }
32     printf("%lld",dp[len]);
33     return 0;
34 }
时间: 2024-10-01 07:10:38

Codeforces 758D Ability To Convert(区间DP)的相关文章

Codeforces 758D Ability To Convert dp

题目链接: http://codeforces.com/problemset/problem/758/D 题意: 一个n进制下的数k,其中k不会用字母,如果有A就用10代替了.求k这个数对应的,在10进制下最小的数. 思路: 来自:http://www.cnblogs.com/TreeDream/p/6322755.html 本质上是把数字分成若干段使得每一段 <n 且没有前导 0 dp[i] 表示前 i 个字符划分好之后能得到的最小数. 状态枚举下一段怎么切. 枚举每一个分割点,对什么进行更新

CodeForces - 1114D Flood Fill (区间dp)

You are given a line of nn colored squares in a row, numbered from 11 to nn from left to right. The ii-th square initially has the color cici. Let's say, that two squares ii and jj belong to the same connected component if ci=cjci=cj, and ci=ckci=ck 

codeforces 598E E. Chocolate Bar(区间dp)

题目链接: E. Chocolate Bar time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You have a rectangular chocolate bar consisting of n × m single squares. You want to eat exactly k squares, so you ma

cf 758D - Ability To Convert

从后往前贪心就好了.各种各样0的情况太BT了.. (各种爆long long,f**k) 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define N 100005 4 #define lowbit(x) x&(-x) 5 using namespace std; 6 inline int ra() 7 { 8 int x=0,f=1; char ch=getchar(); 9 while (ch<'0' || ch&g

Codeforces 509F Progress Monitoring (区间dp 或 记忆化搜索)

F. Progress Monitoring time limit per test 1 second memory limit per test 256 megabytes Programming teacher Dmitry Olegovich is going to propose the following task for one of his tests for students: You are given a tree T with n vertices, specified b

Codeforces 437E The Child and Polygon(区间DP)

题目链接:Codeforces 437E The Child and Polygon 题目大意:给出一个多边形,问说有多少种分割方法,将多边形分割为多个三角形. 解题思路:首先要理解向量叉积的性质,一开始将给出的点转换成顺时针,然后用区间dp计算.dp[i][j]表示从点i到点j可以有dp[i][j]种切割方法.然后点i和点j是否可以做为切割线,要经过判断,即在i和j中选择的话点k的话,点k要在i,j的逆时针方. #include <cstdio> #include <cstring&g

codeforces 149D - Coloring Brackets (区间dp)

题目大意: 给出一组合法的括号. 括号要么不涂颜色,要么就涂上红色或者绿色. 匹配的括号只能有一个有颜色. 两个相邻的括号不能有相同的颜色. 思路分析: 因为是一个合法的括号序列. 所以每个括号与之匹配的位置是一定的. 那么就可以将这个序列分成两个区间. (L - match[L] )  (match[L]+1, R) 用递归先处理小区间,再转移大区间. 因为条件的限制,所以记录区间的同时,还要记录区间端点的颜色. 然后就是一个递归的过程. #include <cstdio> #include

CodeForces 758 D Ability To Convert

Ability To Convert 题意:给你一个n进制的60位的数,但是由于Alexander只会写0->9,所以他就会用10来表示十而不是A(假设进制>10); 题解:模拟就好了,先走往前走进制的位数的倍数,再判断一下首位是不是0,或者这个数有没有大于等于进制,如果有就不行,就要往后走,走到一个非0开头的点,或者就是走到只有1个0的点,然后算出目前这段区间的答案加一个倍数就好了. 代码: 1 #include<bits/stdc++.h> 2 using namespace

Codeforces Round #538 (Div. 2) D. Flood Fill 【区间dp || LPS (最长回文序列)】

任意门:http://codeforces.com/contest/1114/problem/D D. Flood Fill time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a line of nn colored squares in a row, numbered from 11 to nn f