UVA 12105 Bigger is Better(数位DP)
来源:互联网 发布:不看广告的软件 编辑:程序博客网 时间:2024/06/13 12:09
题意不说了。
此题大白书上有2个思路,第一个思路很容易想到,写起来也不难,dp[i][j]代表用了i根火柴,除m余j的最大数,用字符串模拟一下就可以了。用刷表法,用dp[i][j]×10+s去更新dp[i+s的火柴个数][ ( j×10+s) % m]。速度的确很慢因为复杂度是o(n*m*n/2*10)。
第二个思路是用dp[i][j]代表生成i位数余数为j所需要的最少火柴数。这样就可以在知道最多可以有多少位数的情况下从高位枚举找答案了。递推公式跟上面一个差不太多,复杂度只有o(n*m*10),但是写的时候有个小问题,我是往后面加数字,所以在枚举第一位的时候是从1开始的,之后都是从0开始的,目的就是为了避免前导0,其实这样是少东西的,遗漏了第一位放0余数是0也是可以的了。其实由于0所需要的火柴数比较多,所以任何余数需要的火柴数最小的这个数是都不会出现前导0的情况。
AC代码1(1.8s):
//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>#include<stack>#include<cmath>#include<queue>#include<set>#include<map>#include<ctime>#include<string.h>#include<string>#include<sstream>#include<bitset>using namespace std;#define ll long long#define ull unsigned long long#define eps 1e-11#define NMAX 200005#define MOD 1000000007#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define PI acos(-1)template<class T>inline void scan_d(T &ret){ char c; int flag = 0; ret=0; while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c == '-') { flag = 1; c = getchar(); } while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar(); if(flag) ret = -ret;}char dp[110][3005][55];int num[] = {6,2,5,5,4,5,6,3,7,6};bool bigger(char *a, char *b){ int len1 = strlen(a),len2 = strlen(b); if(len1 > len2) return true; if(len1 < len2) return false; for(int i = 0; i <= len1; i++) { if(a[i] > b[i]) return true; if(a[i] < b[i]) return false; } return false;}inline void updata(char *a, char *b, int w){ char temp[55]; strcpy(temp,a); int len = strlen(a); if(temp[0] == '0') temp[0] = w+'0'; else { temp[len] = w+'0'; temp[len+1] = '\0'; } if(bigger(temp,b)) strcpy(b,temp);}int main(){#ifdef GLQ freopen("input.txt","r",stdin);// freopen("o4.txt","w",stdout);#endif // GLQ int n,m,cas=1; while(~scanf("%d",&n) && n) { printf("Case %d: ",cas++); scanf("%d",&m); for(int i = 0; i <= n; i++) for(int j = 0; j < m; j++) dp[i][j][0] = '\0'; dp[0][0][0] = '0'; dp[0][0][1] = '\0'; for(int i = 0; i <= n; i++) for(int j = 0; j < m; j++) if(strlen(dp[i][j]) != 0) for(int s = 0; s <= 9; s++) updata(dp[i][j],dp[i+num[s]][(j*10+s)%m],s); int ans = -1; for(int i = 2; i <= n; i++) if(strlen(dp[i][0]) != 0) if(ans == -1 || bigger(dp[i][0],dp[ans][0])) ans = i; if(ans == -1) { printf("-1\n"); continue; } printf("%s\n",dp[ans][0]); } return 0;}
AC代码2(79ms):
//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>#include<stack>#include<cmath>#include<queue>#include<set>#include<map>#include<ctime>#include<string.h>#include<string>#include<sstream>#include<bitset>using namespace std;#define ll long long#define ull unsigned long long#define eps 1e-11#define NMAX 1000005#define MOD 1000000007#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define PI acos(-1)template<class T>inline void scan_d(T &ret){ char c; int flag = 0; ret=0; while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c == '-') { flag = 1; c = getchar(); } while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar(); if(flag) ret = -ret;}int dp[55][3000];int ge[] = {6,2,5,5,4,5,6,3,7,6};int yu[55],n,m;void dfs(int len,int shu){ if(len == 0) { printf("\n"); return; } for(int i = 9; i >= 0; i--) { int ha = (shu-(i*yu[len-1])%m+m)%m; if(dp[len-1][ha] + ge[i] <= n) { printf("%d",i); n -= ge[i]; dfs(len-1,ha); return; } }}int main(){#ifdef GLQ freopen("input.txt","r",stdin);// freopen("o4.txt","w",stdout);#endif // GLQ int cas = 1; while(~scanf("%d",&n) && n) { printf("Case %d: ",cas++); scanf("%d",&m); yu[0] = 1; for(int i = 1; i <= 51; i++) yu[i] = yu[i-1]*10%m; for(int i = 0; i <= 51; i++) for(int j = 0; j < m; j++) dp[i][j] = NMAX; dp[0][0] = 0; for(int i = 0; i <= n/2+1; i++) for(int j = 0; j < m; j++) if(dp[i][j] != NMAX) { int d = dp[i][j]; for(int k = 0; k <= 9; k++) dp[i+1][(j*10+k)%m] = min(dp[i+1][(j*10+k)%m],d+ge[k]); } int len=-1; for(int i = n/2+1; i >= 1; i--) if(dp[i][0] != NMAX && dp[i][0] <= n) { len = i; break; } if(len == -1) printf("-1\n"); else dfs(len,0); } return 0;}
0 0
- UVA 12105 Bigger is Better(数位dp)
- UVA 12105 Bigger is Better(数位DP)
- UVA 12105 Bigger is Better(数位DP)
- UVA - 12105 Bigger is Better(dp)
- UVA 12105 - Bigger is Better(DP+高精度)
- uva 12105 - Bigger is Better(dp)
- Bigger is Better - UVa 12105 dp
- UVA - 12105 Bigger is Better DP
- UVA - 12105 Bigger is Better (数位dp思路+前导零的判断)
- UVALive 3782 Bigger is Better(数位DP + 大数)
- UVa:12105 Bigger is Better
- uva 12105 Bigger is Better
- UVA 12105 Bigger is Better
- Bigger is Better UVA
- Bigger is Better UVA
- uva 12105——Bigger is Better
- 12105 - Bigger is Better
- UVA12105 - Bigger is Better(DP)
- 设置ListCtrl表头
- poj 2418 Trie
- Sqoop导入关系数据库到Hive
- Uva1587 - Box
- solr的扩展(2)
- UVA 12105 Bigger is Better(数位DP)
- C2第十次解题报告
- C语言字符类型和整数类型的通用性
- 递归练习之斐波那契数列
- 可用的ss-mongo框架的pom.xml及相关的web.xml等
- eclipse 文件路径问题
- xcode to cocos2dx
- java中session的用法
- UVA - 10626 Buying Coke 多状态