十八组题解

A

#include <iostream>

using namespace std;
typedef long long LL;

const int mod = 100003;		   

int n;
int mem[100010];

LL work(int n)
{
	if (mem[n] > 0)
		return mem[n];
	if (n < 0)
		return 0;
	if (n == 1 || n == 0)
		return 1;
	if (n == 3)
		return 2;
	mem[n] = work(n - 1) % mod + work(n - 3) % mod + work(n - 5) % mod;
	return mem[n] % mod;
}
int main()
{
	cin >> n;
	cout << work(n) << endl;
	return 0;
}

B

#include <iostream>

using namespace std;
int n;
int D[101][101];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			cin >> D[i][j];
		}
	}
	for (int i = n - 1; i > 0; i--) {
		for (int j = 1; j <= i; j++) {
			D[i][j] += max(D[i + 1][j], D[i + 1][j + 1]);
		}
	}
	cout << D[1][1] << endl;
	return 0;
}

C

#include <iostream>

using namespace std;

const int N = 510;
int f[N][N];
int map[N][N];

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> map[i][j];
	for (int i = 1; i <= n; i++) {
		f[i][1] = f[i - 1][1] + map[i][1];
	}
	for (int i = 1; i <= n; i++) {
		f[1][i] = f[1][i - 1] + map[1][i];
	}

	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= n; j++) {
			f[i][j] = max(f[i - 1][j], f[i][j - 1]) + map[i][j];
		}
	}
	cout << f[n][n] << endl;
	return 0;
}

D

#include <iostream>

using namespace std;

const int N = 110;

int n, v;
int V[N];
int p[N];
int f[N][10010];

int main()
{
	cin >> n >> v;
	for (int i = 1; i <= n; i++) cin >> V[i] >> p[i];

	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= v; j++) {
			if (j < V[i]) {
				f[i][j] = f[i - 1][j];
			}
			else {
				f[i][j] = max(f[i - 1][j], f[ i - 1][j - V[i]] + p[i]);
			}
		}
	}
	cout << f[n][v] << endl;
	return 0;
}

E

#include <iostream>

using namespace std;

const int N = 110;

int n, W;
int w[N], p[N];
long long f[N][50010];
int main()
{
	cin >> n >> W;
	for (int i = 1; i <= n; i++) cin >> w[i] >> p[i];

	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= W; j++) {
			if (j < w[i]) {
				f[i][j] = f[i - 1][j];
			}
			else {
				f[i][j] = max(f[i - 1][j], f[i][j - w[i]] + p[i]);
			}
		}
	}
	cout << f[n][W] << endl;
	return 0;
}

F

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;
const int W = 50010;

int n, m;
int w[N];
int p[N];
int c[N];
int f[N][W];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> w[i] >> p[i] >> c[i];
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			for (int k = 0; k <= c[i] && k * w[i] <= j; k++ ) {
				f[i][j] = max(f[i][j], f[i - 1][j - k * w[i]] + k * p[i]);
			}
		}
	}
	cout << f[n][m] << endl;
}

G

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;

int n;
int f[N];
int a[N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		f[i] = 1;
		for (int j = 1; j <= i; j++) {
			if (a[i] > a[j]) {
				f[i] = max(f[i], f[j] + 1);
			}
		}
	}
	int res = 0;
	for (int i = 1; i <= n; i++) {
		res = max(res, f[i]);
	}
	cout << res << endl;
}

I

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 420;
int INF = 0x3f3f3f3f;
int n;
int f[N][N];
int g[N][N];
int s[N], a[N];

int main()
{	
	memset(f, -INF, sizeof f);
	memset(g, INF, sizeof g);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[i + n] = a[i];
	}
	for (int i = 1; i <= 2 * n; i++) {
		s[i] = a[i] + s[i - 1];
		g[i][i] = 0, f[i][i] = 0;
	}

	for (int len = 2; len <= 2 * n; len++) {
		for (int l = 1; len + l - 1 <= 2 * n; l++) {
			int r = l + len - 1;
			for (int k = l; k < r; k++) {
				f[l][r] = max(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
				g[l][r] = min(g[l][r], g[l][k] + g[k + 1][r] + s[r] - s[l - 1]);
			}
		}
	}
	int maxv = -INF, minv = INF;
	for (int i = 1; i <= n; i++) {
		maxv = max(f[i][i + n - 1], maxv);
		minv = min(g[i][i + n - 1], minv);
	}

	cout << minv << endl << maxv << endl;
	return 0;
}

J

#include <iostream>

using namespace std;

typedef long long LL;
const int N = 50010;
int INF = 0x3f3f3f3f;
int n, a[N];

int main()
{
	cin >> n;
	LL sum = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
	}
	LL s1 = 0, s2 = 0;
	LL resmax = 0, resmin = 0;
	for (int i = 1; i <= n; i++) {
		if (s1 < 0)
			s1 = 0;
		s1 += a[i];
		resmax = max(s1, resmax);
	}
	for (int i = 1; i <= n; i++) {
		if (s2 > 0)
			s2 = 0;
		s2 += a[i];
		resmin = min(s2, resmin);
	}
	LL res = max(resmax, sum - resmin);
	cout << res << endl;
	return 0;
}

L

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 110;

int n, m;
int f[N][N];
int h[N][N];
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };

int dp(int x, int y)
{
	int& v = f[x][y];
	if (v != -1)
		return v;
	v = 1;
	for (int i = 0; i < 4; i++) {
		int a = x + dx[i], b = y + dy[i];
		if (a >= 1 && a <= n && b >= 1 && b <= m && h[a][b] < h[x][y]) {
			v = max(v, dp(a, b) + 1);
		}
	}
	return v;
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> h[i][j];
		}
	}
	int res = 0;
	memset(f, -1, sizeof f);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			res = max(res, dp(i, j));
		}
	}
	cout << res << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值