本文主要是介绍uva 11375 - Matches(递推),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:11375 - Matches
题目大意:给出n根火柴,问说能组成多少种数字,要求说0不能打头。
解题思路:d[i]表示i根火柴能够组成的数量,d[i+c[j]] = d[i+c[j]] + d[i];
最后dp[i]表示小于等于i根火柴能组成的数量,dp[i]=∑jidp[j].
高精度。
#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;
const int MAXN = 505;struct bign {int len, num[MAXN];bign () {len = 0;memset(num, 0, sizeof(num));}bign (int number) {*this = number;}bign (const char* number) {*this = number;}void DelZero ();void Put ();void operator = (int number);void operator = (char* number);bool operator < (const bign& b) const;bool operator > (const bign& b) const { return b < *this; }bool operator <= (const bign& b) const { return !(b < *this); }bool operator >= (const bign& b) const { return !(*this < b); }bool operator != (const bign& b) const { return b < *this || *this < b;}bool operator == (const bign& b) const { return !(b != *this); }void operator ++ ();void operator -- ();bign operator + (const int& b);bign operator + (const bign& b);bign operator - (const int& b);bign operator - (const bign& b);bign operator * (const int& b);bign operator * (const bign& b);bign operator / (const int& b);//bign operator / (const bign& b);int operator % (const int& b);
};/*Code*/const int N = 2005;
const int c[20] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
bign dp[N];int main () {dp[0] = 1;dp[1] = 0;for (int i = 0; i <= 2000; i++) {for (int j = 0; j < 10; j++) {if (i == 0 && j == 0)continue;if (i + c[j] <= 2000)dp[i+c[j]] = dp[i+c[j]] + dp[i];}}dp[6] = dp[6] + 1;for (int i = 2; i <= 2000; i++)dp[i] = dp[i] + dp[i-1];int n;while (scanf("%d", &n) == 1 && n > 0) {dp[n].Put();printf("\n");}return 0;
}void bign::DelZero () {while (len && num[len-1] == 0)len--;if (len == 0) {num[len++] = 0;}
}void bign::Put () {for (int i = len-1; i >= 0; i--) printf("%d", num[i]);
}void bign::operator = (char* number) {len = strlen (number);for (int i = 0; i < len; i++)num[i] = number[len-i-1] - '0';DelZero ();
}void bign::operator = (int number) {len = 0;while (number) {num[len++] = number%10;number /= 10;}DelZero ();
}bool bign::operator < (const bign& b) const {if (len != b.len)return len < b.len;for (int i = len-1; i >= 0; i--)if (num[i] != b.num[i])return num[i] < b.num[i];return false;
}void bign::operator ++ () {int s = 1;for (int i = 0; i < len; i++) {s = s + num[i];num[i] = s % 10;s /= 10;if (!s) break;}while (s) {num[len++] = s%10;s /= 10;}
}void bign::operator -- () {if (num[0] == 0 && len == 1) return;int s = -1;for (int i = 0; i < len; i++) {s = s + num[i];num[i] = (s + 10) % 10;if (s >= 0) break;}DelZero ();
}bign bign::operator + (const int& b) {bign a = b;return *this + a;
}bign bign::operator + (const bign& b) {int bignSum = 0;bign ans;for (int i = 0; i < len || i < b.len; i++) {if (i < len) bignSum += num[i];if (i < b.len) bignSum += b.num[i];ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}while (bignSum) {ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}return ans;
}bign bign::operator - (const int& b) {bign a = b;return *this - a;
}bign bign::operator - (const bign& b) {int bignSub = 0;bign ans;for (int i = 0; i < len || i < b.len; i++) {bignSub += num[i];bignSub -= b.num[i];ans.num[ans.len++] = (bignSub + 10) % 10;if (bignSub < 0) bignSub = -1;}ans.DelZero ();return ans;
}bign bign::operator * (const int& b) {int bignSum = 0;bign ans;ans.len = len;for (int i = 0; i < len; i++) {bignSum += num[i] * b;ans.num[i] = bignSum % 10;bignSum /= 10;}while (bignSum) {ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}return ans;
}bign bign::operator * (const bign& b) {bign ans;ans.len = 0; for (int i = 0; i < len; i++){ int bignSum = 0; for (int j = 0; j < b.len; j++){ bignSum += num[i] * b.num[j] + ans.num[i+j]; ans.num[i+j] = bignSum % 10; bignSum /= 10;} ans.len = i + b.len; while (bignSum){ ans.num[ans.len++] = bignSum % 10; bignSum /= 10;} } return ans;
}bign bign::operator / (const int& b) {bign ans;int s = 0;for (int i = len-1; i >= 0; i--) {s = s * 10 + num[i];ans.num[i] = s/b;s %= b;}ans.len = len;ans.DelZero ();return ans;
}int bign::operator % (const int& b) {bign ans;int s = 0;for (int i = len-1; i >= 0; i--) {s = s * 10 + num[i];ans.num[i] = s/b;s %= b;}return s;
}
这篇关于uva 11375 - Matches(递推)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!