Codeforces 383D Antimatter【dp】
来源:互联网 发布:淘宝网mac版客户端 编辑:程序博客网 时间:2024/05/16 10:09
题目大意:
给你一个长度为N的序列,可以将任意数加上一个正号或者是负号.
求一共有多少个连续的子序列和为0.
思路:
1、统计计数问题,考虑dp:
①设定dp【i】【j】表示进行到第i位,和为j的方案数。
②考虑到会有负数和的情况出现,并且观察到题目保证a1+a2+a3+a4+................不会超过10000.那么显然,如果我们对所有数字都加上了负号,那么对应和不会小于-10000.
那么我们知道数组下标都是正的才行,那么我们考虑将15000设定为0.对应dp【i】【15000】就是表示加到第i位和为0的情况数。
2、那么接下我们考虑状态转移方程:
①dp【i】【j】+=dp【i-1】【j-a【i】】;
②dp【i】【j】+=dp【i-1】【j+a【i】】;
表示我们当前第i位的和紧接着上一位的和延续下去。
③dp【i】【15000+a【i】】=1;
④dp【i】【15000-a【i】】=1;
表示当前第i位的和独立出来,作为起点。
3、注意取模。
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;#define mod 1000000007int a[1005];int dp[1005][30000];int main(){ int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } dp[1][15000+a[1]]=1; dp[1][15000-a[1]]=1; for(int i=2;i<=n;i++) { dp[i][15000+a[i]]=1; dp[i][15000-a[i]]=1; for(int j=0;j<30000;j++) { dp[i][j]=(dp[i][j]+dp[i-1][j-a[i]])%mod; dp[i][j]=(dp[i][j]+dp[i-1][j+a[i]])%mod; } } int output=0; for(int i=1;i<=n;i++) { output=(output+dp[i][15000])%mod; } printf("%d\n",output); }}
0 0
- Codeforces 383D. Antimatter DP
- codeforces 383D Antimatter (dp)
- Codeforces 383D Antimatter【dp】
- CodeForces 383D Antimatter(DP)
- Codeforces 383D. Antimatter
- CODEFORCES, 383D Antimatter
- CF:Problem 383D - Antimatter 分治DP
- Codeforces Round #225 (Div. 1) D. Antimatter
- 【DP】CodeForces 148D
- Codeforces 221D(dp)
- Codeforces 572D,DP
- codeforces 9D DP
- codeforces 519D dp
- Codeforces 358D【DP】
- codeforces 474D DP
- Codeforces 830D [DP]
- Codeforces 161D 树形DP
- 【数位DP】 【CodeForces 55D】
- scala的元组和数组
- 【Poj1088 滑雪】记忆化搜索
- LoadRunner设置系统资源监控
- NOIP模拟题 [SPFA][DP][栈结构]
- Android 绘制环形进度图
- Codeforces 383D Antimatter【dp】
- [生存志] 第30节 历代大事件概览 共和国(2013年后)
- Windows7下redmine-3.3.1的安装详解
- 大数据系统的Lambda架构
- unity3D游戏开发六之创建基本游戏场景三
- 文章标题
- centos下/etc/sysconfig/下找不到iptables文件
- Android状态栏、导航栏全透明
- scala查看本地文件以及查看网页源码