SRM 609 D2L3: VocaloidsAndSongs,dp
2014-02-17 23:51
519 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12989&rd=15842
不算难,注意 base case是 cur == S,cur表示当前已经唱了的歌曲数。
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
/*************** Program Begin **********************/
int dp[51][51][51][51];
int d1[] = {1, 0, 1, 0, 1, 0, 1};
int d2[] = {0, 1, 1, 0, 0, 1, 1};
int d3[] = {0, 0, 0, 1, 1, 1, 1};
const int MOD = 1e9 + 7;
class VocaloidsAndSongs {
public:
int S, gumi, ia, mayu;
int rec(int cur, int v1, int v2, int v3)
{
if (cur == S) {
if (v1 == gumi && v2 == ia && v3 == mayu) {
return 1;
} else {
return 0;
}
}
int & res = dp[cur][v1][v2][v3];
if (res != -1) {
return res;
}
res = 0;
for (int i = 0; i < 7; i++) {
int t1 = v1 + d1[i];
int t2 = v2 + d2[i];
int t3 = v3 + d3[i];
if (t1 > gumi || t2 > ia || t3 > mayu) {
continue;
} else {
res += rec(cur + 1, t1, t2, t3);
res %= MOD;
}
}
return res;
}
int count(int S, int gumi, int ia, int mayu) {
this->S = S;
this->gumi = gumi;
this->ia = ia;
this->mayu = mayu;
memset(dp, -1, sizeof(dp));
return rec(0, 0, 0, 0);
}
};
/************** Program End ************************/
不算难,注意 base case是 cur == S,cur表示当前已经唱了的歌曲数。
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
/*************** Program Begin **********************/
int dp[51][51][51][51];
int d1[] = {1, 0, 1, 0, 1, 0, 1};
int d2[] = {0, 1, 1, 0, 0, 1, 1};
int d3[] = {0, 0, 0, 1, 1, 1, 1};
const int MOD = 1e9 + 7;
class VocaloidsAndSongs {
public:
int S, gumi, ia, mayu;
int rec(int cur, int v1, int v2, int v3)
{
if (cur == S) {
if (v1 == gumi && v2 == ia && v3 == mayu) {
return 1;
} else {
return 0;
}
}
int & res = dp[cur][v1][v2][v3];
if (res != -1) {
return res;
}
res = 0;
for (int i = 0; i < 7; i++) {
int t1 = v1 + d1[i];
int t2 = v2 + d2[i];
int t3 = v3 + d3[i];
if (t1 > gumi || t2 > ia || t3 > mayu) {
continue;
} else {
res += rec(cur + 1, t1, t2, t3);
res %= MOD;
}
}
return res;
}
int count(int S, int gumi, int ia, int mayu) {
this->S = S;
this->gumi = gumi;
this->ia = ia;
this->mayu = mayu;
memset(dp, -1, sizeof(dp));
return rec(0, 0, 0, 0);
}
};
/************** Program End ************************/
相关文章推荐
- TC-SRM-609-DIV2-950- VocaloidsAndSongs
- TopCoder SRM 651 Div2 Problem 500 - FoxAndSouvenirTheNext (DP)
- SRM 572 D2L3:DistinctRemainders,dp,math
- SRM 612 D2L3:PowersOfTwo,dp
- SRM 602 D2L3:BlackBoxDiv2,dp
- SRM 620 D2L3: RandomGraph, dp
- SRM 627 D2L3: BubbleSortWithReversals, dp, 冒泡排序
- SRM 620 D2L3: RandomGraph, dp
- SRM 599 D2L3: SimilarNames2,dp
- SRM 601 D2 L3:WinterAndReindeers,dp
- SRM 610 D2L3:MiningGoldEasy,dp
- SRM 604 D2L3:FoxConnection2,dp
- SRM 595 D2 L3:LittleElephantAndXor, dp
- SRM 591 D2L3:YetAnotherTwoTeamsProblem,dp
- SRM 601 D1 L2:WinterAndSnowmen, dp
- SRM 615 D2L3:MergeStrings,dp
- Codeforces 766C Mahmoud and a Message 基础DP
- Codeforces Good Bye 2015 D. New Year and Ancient Prophecy DP
- Codeforces Round #396 (Div. 2) C. Mahmoud and a Message dp
- SGU 495 Kids and Prizes (概率期望DP)