#include <stdio.h>
#include <string.h>
#define MAXN 1001
#define MAXM 1000001
int n, m;
char maze[MAXN][MAXN];
int block[MAXN][MAXN]; // 标记每个格子所属的连通块编号
int blockSize[MAXN * MAXN]; // 记录每个连通块的大小
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
// 深度优先搜索函数
int dfs(int x, int y, int id) {
if (x < 1 || x > n || y < 1 || y > n || block[x][y] != 0) return 0;
block[x][y] = id;
int size = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (maze[nx][ny] != '\0' && maze[nx][ny] != maze[x][y]) {
size += dfs(nx, ny, id);
}
}
return size;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", maze[i] + 1);
}
int blockId = 1;
// 标记所有连通块并记录大小
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (block[i][j] == 0) {
blockSize[blockId] = dfs(i, j, blockId);
blockId++;
}
}
}
// 处理询问
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", blockSize[block[x][y]]);
}
return 0;
}
#include<stdio.h>
int max(int a,int b){
return a>b?a:b;
}
int main()
{
int t,m,w[103],v[103],dp[103][1003];
scanf("%d %d",&t,&m);
for(int i=1;i<=m;i++){
scanf("%d %d",&w[i],&v[i]);
}
for(int i=1;i<=m;i++)
for(int j=t;j>=0;j--)
{
if(j>=w[i])
{
dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j]);
}
else
{
dp[i][j]=dp[i-1][j];
}
}
printf("%d",dp[m][t]);
return 0;
}
学了图及最短路径问题,并刷了些题。