ダイナミックプログラミングトレーニング#19

http://www.51nod.com/Challenge/Problem.html#problemId=1202

効果の件名:

O(n)の異なる本質的に配列番号の配列を得るために

動的計画法を考えてみます。

DP [i]は前席iのシーケンス番号を示します

それは本質的に異ならない場合、明らかに、サブセットの数に等しいサブシーケンス番号が2 ^ N ^ -1であります

しかし、キーはにある異なる性質?方法は?

もちろん、インクルージョン排除を考慮

位置は、VISと呼ば[[i]は] [i]と表示されますを示しています

限り時間を失うこととDP DP [VIS [[i]は] - 1]失われた複製します

コード:

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
long long dp[100055];
long long a[100055];
long long vis[100055];
int main()
{
    int n, i;
    while(~scanf("%d", &n))
    {
        for(i = 1; i <= n; i++)scanf("%lld", &a[i]);
        memset(vis, 0, sizeof(vis));
        memset(dp, 0, sizeof(dp));
        dp[0] = 1;
        for(i = 1; i <= n; i++)
        {
            dp[i] = (dp[i - 1]<<1) % mod;
            if(vis[a[i]])
                dp[i] = (dp[i] - dp[vis[a[i]] - 1] + mod) % mod,vis[a[i]] = i;
            else vis[a[i]] = i;
        }
        printf("%lld\n", dp[n] - 1);
    }
}

おすすめ

転載: www.cnblogs.com/wzxbeliever/p/11775251.html