[BZOJ3598]-[Scoi2014]方伯伯的商场之旅-数位dp
2018-03-08 17:20
465 查看
说在前面
感觉me就像没有学过数位dp…药丸
题目
BZOJ3598传送门不是权限题…
看题面可以戳传送门
解法
通常的数位dp,都是局限于:数位贡献独立,一旦确定了前面的信息,后面的部分就可以记忆化搜索完成然而这道题,每个数字都有着它自己的最优合并位置,因此一次出答案的方法行不通
(或者me太蠢了没想出来)
然后就去看了题解
既然确定最优位置很困难,于是不妨考虑变化量。
先假设所有数字的合并位置都是第一位,算出贡献。然后把合并位置改成第二位,算出代价变化量。如果代价变化为正,那么舍弃掉就好
卧槽me感觉SCOI2014怎么毒性那么大啊啊啊啊啊啊,要是me去考完都完了啊啊啊啊啊
下面是代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; int K , w[60] , ws ; long long L , R , dp[60][2500] ; void div( long long x ){ int t = 0 ; memset( w , 0 , sizeof( w ) ) ; while( x ) w[++t] = x %K , x /= K ; } int mid ; long long predfs( int dep , int sum , bool limit ){ if( !dep ) return sum ; if( !limit && dp[dep][sum] != -1 ) return dp[dep][sum] ; long long rt = 0 ; int lim = ( limit ? w[dep] : K - 1 ) ; for( int i = 0 ; i <= lim ; i ++ ) rt += predfs( dep - 1 , sum + i * ( dep - mid ) , ( i == lim )&limit ) ; if( !limit ) dp[dep][sum] = rt ; return rt ; } long long dfs( int dep , int sum , bool limit ){ if( !dep ) return sum > 0 ? sum : 0 ; if( !limit && dp[dep][sum] != -1 ) return dp[dep][sum] ; long long rt = 0 ; int lim = ( limit ? w[dep] : K - 1 ) ; for( int i = 0 ; i <= lim ; i ++ ){ int delta = ( dep >= mid ? 1 : -1 ) * i ; rt += dfs( dep - 1 , sum + delta , ( i == lim )&limit ) ; } if( !limit ) dp[dep][sum] = ( rt > 0 ? rt : 0 ) ; return rt > 0 ? rt : 0 ; } void solve(){ long long ans = 0 ; memset( dp , -1 , sizeof( dp ) ) ; mid = 1 ; div( R ) , ans += predfs( ws , 0 , true ) ; memset( dp , -1 , sizeof( dp ) ) ; div(L-1) , ans -= predfs( ws , 0 , true ) ; for( mid = 2 ; mid <= ws ; mid ++ ){ memset( dp , -1 , sizeof( dp ) ) ; div( R ) , ans -= dfs( ws , 0 , true ) ; memset( dp , -1 , sizeof( dp ) ) ; div(L-1) , ans += dfs( ws , 0 , true ) ; } printf( "%lld" , ans ) ; } int main(){ scanf( "%lld%lld%d" , &L , &R , &K ) ; long long t = R ; while( t ) ws ++ , t /= K ; solve() ; }
相关文章推荐
- bzoj 3598: [Scoi2014]方伯伯的商场之旅【数位dp】
- 【数位dp】[Scoi2014] bzoj3598 方伯伯的商场之旅
- bzoj 3598 [Scoi2014]方伯伯的商场之旅 数位dp
- [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)
- bzoj3598 [Scoi2014]方伯伯的商场之旅
- 【BZOJ3598】【SCOI2014】方伯伯的商场之旅
- BZOJ3598 [Scoi2014]方伯伯的商场之旅
- bzoj3598[SCOI2014]方伯伯的商场之旅
- 【bzoj3598】 Scoi2014—方伯伯的商场之旅
- 【bzoj3598】: [Scoi2014]方伯伯的商场之旅
- BZOJ3598[Scoi2014]方伯伯的商场之旅 数位DP
- BZOJ3598 SCOI2014方伯伯的商场之旅(数位dp)
- 【bzoj 3598】: [Scoi2014]方伯伯的商场之旅
- bzoj3598 [Scoi2014]方伯伯的商场之旅
- [bzoj3594][Scoi2014]方伯伯的玉米田 树状数组优化dp
- 【二维树状数组优化dp】[Scoi2014] bzoj3594方伯伯的玉米田
- [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
- BZOJ3594 [Scoi2014]方伯伯的玉米田 【树状数组优化dp】
- bzoj 3594: [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
- BZOJ 3594 [SCOI 2014] 方伯伯的玉米田 (DP,树状数组优化)