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);
}
}