题目
P1387 最大正方形
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
signed main () {
int n, m;
int a[110][110] = {0};
int dp[110][110] = {0};
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%lld", &a[i][j]);
}
}
int mmax = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] == 0) {
dp[i][j] = 0;
} else {
dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1;
}
mmax = max(mmax, dp[i][j]);
}
}
printf("%lld\n", mmax);
return 0;
}
采药
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 1003;
int n, m;
int t[N];
int v[N];
int f1[1002];
int f2[1002];
signed main () {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
scanf("%lld %lld", &t[i], &v[i]);
}
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (j >= t[i]) {
f2[j] = max(f1[j - t[i]] + v[i], f1[j]);
} else {
f2[j] = f1[j];
}
}
memcpy(f1, f2, sizeof(f1));//滚动数组优化
}
cout << f1[n] << '\n';//打印结果
return 0;
}
数字三角形
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
//#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 1002;
int main () {
int a[N][N] = {0};
int dp[N][N] = {0};
int n;
// while (1) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
scanf("%d", &a[i][j]);
}
}
for (int j = 1; j <= n; j++) {
dp[n][j] = a[n][j];
// cout<<dp[n][j]<<' ';
}
// cout<<'\n';
for (int i = n - 1; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j];
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=i;j++){
// cout<<dp[i][j]<<' ';
// }
// cout<<'\n';
//
// }
printf("%d\n", dp[1][1]);
// }
return 0;
}