题目大意:
各位数字先增后减的数称为峰值数(位数大于等3且第一位非零),然后两个峰值数连在一起是一个bi-peak数,求两个数之间bi-peak数的各位数字之和的最大值。
解题思路:
数位dp,dp[i][j][k]表示当前后面还有i位,j表示前一位的数字,k表示与峰值的状态关系。
k=0 表示前面的为零,k=1表示前面恰好有一个在第一个波峰的上坡上,k=2表示前面至少有两个在第一个波峰的上坡上,k=3表示在第一个波峰的下坡上,k=4表示前面恰好有一个在第二个波峰的上坡上,k=5表示前面至少有两个在第二个波峰的上坡上,k=6表示在第二个波峰的下坡上。
#include<iostream> #include<cstdio> #include<string> #include<string.h> #include<algorithm> #include<cstdlib> #include<ctime> #include<cmath> #include<iomanip> #include<map> #include<vector> #include<queue> #include<stack> #include<bitset> //#include<bits/stdc++.h> using namespace std; typedef unsigned long long LL; const double Pi = acos(-1.0); const double eps = 1e-9; const int INF = 0x3f3f3f3f; const int MOD = 1e9+7; const int MAXN = 320000+10; int dp[30][20][20]; int aa[30]; int bb[30]; int dfs(int len,int last,int flag,bool mxl,bool mxl2) { if(!len) { return (flag==6)?0:-1; } if(!mxl && !mxl2 && dp[len][last][flag]!=-1) { return dp[len][last][flag]; } int res=-1; int minpos=mxl?aa[len]:0; int maxpos=mxl2?bb[len]:9; for(int i=minpos; i<=maxpos; ++i) { int status=0; if(flag==0&&i) status=1; else if(flag==1) { if(i> last) status=2; else status=-1; } else if(flag==2) { if(i< last) status=3; else if(i==last) status=-1; else status=2; } else if(flag==3) { if(i>last) status=4; else if(i==last) { if(i) status=4; else status=-1; } else status=3; } else if(flag==4) { if(i> last) status=5; else status=-1; } else if(flag==5) { if(i< last) status=6; else if(i==last) status=-1; else status=5; } else if(flag==6) { if(i< last) status=6; else status=-1; } if(status!=-1) { int temp=dfs(len-1,i,status,mxl && i==minpos, mxl2 && i==maxpos); if(temp!=-1) res=max(res,i+temp); } } if(!mxl&&!mxl2) { dp[len][last][flag]=res; } return res; } int main() { LL l,r; int t; cin>>t; int casee=1; memset(dp,-1,sizeof(dp)); while(t--) { cin>>l>>r; int len=0; while(r) { aa[++len]=l%10; l/=10; bb[len]=r%10; r/=10; } int ans=dfs(len,0,0,true,true); cout<<"Case "<<casee++<<": "; if(ans==-1) { cout<<"0"<<endl; } else { cout<<ans<<endl; } } return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/389 (转载时请注明本文出处及文章链接)
发表评论
快来吐槽一下吧!