这个题目不难,但是我做的还比较复杂,不过还是很开心,至少做出来了,开始因为爆int了还wa了一发,搞得我以为自己做错了
#include <cstdio> #include <cstdlib> #include <map> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <iostream> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1e5 + 100; ll dp[maxn][2]; ll sum[maxn]; int main() { int n, x, len = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &x); sum[x] += x; len = max(len, x); } for(int i=1;i<=len;i++) { if(sum[i]) { dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] = dp[i - 1][0] + sum[i]; } else { dp[i][0] = dp[i][1] = max(dp[i - 1][0], dp[i - 1][1]); } } printf("%lld ", max(dp[len][0], dp[len][1])); return 0; }
这个题目开始感觉有点难,后来好像也没有想象之中的那么难,
定义dp[i]表示组成数字i的方案数
#include <cstdio> #include <cstdlib> #include <map> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <iostream> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1e5 + 100; const int mod = 1e9 + 7; ll dp1[110], dp2[110];//定义为权值和为i的方案数。 int main() { int n, k, d; scanf("%d%d%d", &n, &k, &d); dp1[0] = dp2[0] = 1; for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { if (i < j) break; dp1[i] = (dp1[i] + dp1[i - j]) % mod; } } for(int i=1;i<=n;i++) { for(int j=1;j<=d-1;j++) { if (i < j) break; dp2[i] = (dp2[i] + dp2[i - j]) % mod; } } printf("%lld ", (dp1[n] - dp2[n]+mod)%mod); return 0; }