一開始写的高位往低位递推,发现这样有些时候保证不了第四条要求。于是又開始写高位往低位的记忆化搜索,又发现传參什么的蛋疼的要死。然后又发现高位開始的记忆化搜索就是从低位往高位的递推呀,遂过之。
dp[i][j]记录在i位 且 余数为j时的最优解情况。
dp[i][j].next表示当前的最优解是由哪一种状态转移过来的。
代码又写锉了。。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #pragma comment(linker, "/STACK:1024000000"); #define EPS (1e-8) #define LL long long #define ULL unsigned long long #define _LL __int64 #define _INF 0x3f3f3f3f #define Mod 9999991 using namespace std; struct N { bool mark; int ans,dig,next; }dp[111][10000]; char s[110]; int mod1[110],mod2[110]; void Out(int site,int mod) { if(mod == -1) return ; printf("%d",dp[site][mod].dig); Out(site+1,dp[site][mod].next); } int main() { int k,i,j,l; while(scanf("%s %d",s+1,&k) != EOF) { for(i = 1; s[i] != '