标签:dp
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <deque> #include <cctype> #define LL long long #define INF 0x7fffffff using namespace std; long long int dp[100005]; int a[100005]; int main() { int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); map<int,int> num; //num记录前一个a[i]的位置 for(int i = 0;i < n;i++){ scanf("%d",&a[i]); num[a[i]] = 0; } dp[0] = 0; dp[1] = a[0]; num[a[0]] = 1; for(int i = 1;i < n;i++){ /* dp[i] 为前i个美丽的数组的和 前i个和包括前i-1个的和 dp[i-1] 还有由第i个数组成的和 dp[i] - dp[i-1] + a[i] * (i+1 - num[a[i]]); 其中的i+1 - num[a[i]] 是用于去除重复的a[i],重复的只计算一次 */ dp[i+1] = dp[i] + dp[i] - dp[i-1] + a[i] * (i+1 - num[a[i]]); num[a[i]] = i+1; //将新的位置记录下来 } cout << dp[n] << endl; } return 0; }
浙江省 2015 省赛 D Beauty of Array dp
标签:dp
原文地址:http://blog.csdn.net/qq_24667639/article/details/45272833