昊昊喜欢运动
他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)舍友有Q个问题,问昊昊第l天到第r天参加了多少种不同的运动。
输入:
输入两个数N, M (1≤N≤2000, 1≤M≤100);
输入N个数ai表示在第i天昊昊做了第ai类型的运动;
输入一个数Q(1≤Q≤10^6)
输入Q行 每行两个数 l, r(1≤l≤r≤n)
输出:
一共Q行
每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动
样例输入:
5 3
1 2 3 2 2
3
1 4
2 4
1 5
样例输出:
3
2
3
直接打表
#include <cstdio>
#include <queue>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define N 2000+100
int arr[N];
int dp[N][N];
int vis[N];
map<int,int> mp;
int main()
{
int n, m;
scanf("%d%d",&n,&m);
int ans = 0;
for(int i = 1;i <= n; i++) scanf("%d",&arr[i]);
for(int i = 1;i <= n; i++) {
memset(vis,0,sizeof(vis));
ans = 0;
for(int j = i;j <= n; j++) {
if(vis[arr[j]]==0) {
ans++;
vis[arr[j]]++;
}
dp[i][j] = ans;
}
}
int l, r, q;
scanf("%d",&q);
while(q--) {
scanf("%d%d",&l,&r);
printf("%d\n",dp[l][r]);
}
return 0;
}
用map插入
#include <cstdio>
#include <queue>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define N 2000+100
int arr[N];
int dp[N][N];
map<int,int> mp;
int main()
{
int n, m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n; i++) scanf("%d",&arr[i]);
for(int i = 1;i <= n; i++) {
mp.clear();
for(int j = i;j <= n; j++) {
mp[arr[j]]++;
dp[i][j] = mp.size();
}
}
int l, r, q;
scanf("%d",&q);
while(q--) {
scanf("%d%d",&l,&r);
printf("%d\n",dp[l][r]);
}
return 0;
}

本文介绍了一个算法问题,即如何计算某人在指定时间段内参与的不同类型运动的数量。通过使用动态规划和哈希表的方法,该问题可以高效解决。
753

被折叠的 条评论
为什么被折叠?



