自己真蠢,想了好久才发现自己忘了考虑99结尾的情况…… 附C++代码:
#include <iostream> using namespace std; int main() { int dp[1000][1000]; int T, a, b, x, m; for(int i=0; i<1000; i++) { dp[i][0]=0; if(i%100==99) dp[i][1]=19;//结尾99的情况 else if(i%10==9) dp[i][1]=10;//结尾9的情况 else dp[i][1]=1; } for(int i=0; i<1000; i++) for(int j=2; j<1000-i; j++) { dp[i][j]=dp[i][j-1]+dp[i+j-1][1]; } cin>>T; for(int I=0; I<T; I++) { cin>>a>>b>>x; m=0; for(int i=0; i<=x; i++) m=max(m, dp[a][i]+dp[b][x-i]); cout<<"Case "<<I+1<<": "<<m<<endl; } return 0; }
DP加打表
//状态:从i处加j个得分所需要翻得牌数 #include <iostream> #include <string.h> using namespace std; int dp[2010][2010]; int main() { int num; cin >> num; memset(dp, 0, sizeof(dp)); for (int i = 0; i < 1010; ++i) { if (i % 100 == 99) { dp[i][1] = 19; } else if (i % 10 == 9) { dp[i][1] = 10; } else { dp[i][1] = 1; } } for (int i = 0; i < 1000; ++i) { for (int j = 2; j < 1000; ++j) { dp[i][j] = dp[i][j - 1] + dp[i + j - 1][1]; } } for (int k = 1; k <= num; ++k) { int _left, _right, n; cin >> _left >> _right; cin >> n; int _max = 0; for (int i = 0; i <= n; ++i) { if (_max < dp[_left][i] + dp[_right][n - i]) { _max = dp[_left][i] + dp[_right][n - i]; } } cout << "Case " << k << ": "; cout << _max << endl; } return 0; }
太坑了
自己真蠢,想了好久才发现自己忘了考虑99结尾的情况……
附C++代码:
DP加打表
太坑了