zoj 3872(dp)

来源:互联网 发布:什么得什么知成语 编辑:程序博客网 时间:2024/06/04 19:31
//题意:求一段序列里有多个连续的子序列 每个连续子序列中各个元素(相同的只算一个)相加之和为n //           求所有这样的n累加之和//方法:动规的思想 dp[i]表示以第i个元素为右顶点的所有区间的累加和//           利用pre数组 pre[i] 记录的是元素i上一次出现的位置//           ss数组保存这段序列////状态转移方程:dp[i] = dp[i - 1] + (i - pre[ss[i]]) * ss[i];//                   #include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;int pre[1000005];int main(){    int t;    int ss[100005];    long long int dp[100005], ans;    scanf("%d", &t);    while(t--)    {        int n;        scanf("%d", &n);        for(int i = 0; i < n; i++)            scanf("%d", &ss[i]);        ans = 0;        memset(pre, -1, sizeof pre);        dp[0] = ss[0];        pre[ss[0]] = 0;        for(int i = 1; i < n; i++)        {            dp[i] = dp[i - 1] + 1ll * (i - pre[ss[i]] ) * ss[i];            pre[ss[i]] = i;            ans += dp[i];        }        printf("%lld\n", ans + dp[0]);    }    return 0;}


0 0
原创粉丝点击