您的位置:首页 > 其它

FZU Problem 2129 子序列个数

2013-10-09 21:30 232 查看
看了 dp 方程之后应该是妙懂

每次 加入一个数,×2 然后剪掉重复的; 重复的个数 维前面那个数,,,,,

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mod 1000000007
using namespace std;

long long dp[1123456],pre[1123456];
int main( )
{
int N;
while( scanf("%d",&N) != EOF )
{
memset( pre,0,sizeof( pre) );
memset( dp,0,sizeof(dp) );
int now; scanf("%d",&now); dp[1] = 1; pre[now] = 1;
for( int i = 2; i <= N; i++ )
{
int now; scanf("%d",&now);
dp[i] = (((dp[i-1]*2)%mod) - dp[pre[now]-1]);
if( !pre[now] )dp[i] += 1;
pre[now] = i;
dp[i] += mod;
dp[i] %= mod;
}
printf("%lld\n",dp
);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: