Dynamic Programming?

来源:互联网 发布:数据加密芯片 编辑:程序博客网 时间:2024/05/22 11:50

Description

Dynamic Programming, short for DP, is the favorite of iSea. It is a method for solving complex problems by breaking them down into simpler sub-problems. It is applicable to problems exhibiting the properties of overlapping sub-problems which are only slightly smaller and optimal substructure. 
Ok, here is the problem. Given an array with N integers, find a continuous subsequence whose sum’s absolute value is the smallest. Very typical DP problem, right? 
 

Input

The first line contains a single integer T, indicating the number of test cases. 
Each test case includes an integer N. Then a line with N integers Ai follows. 

Technical Specification
1. 1 <= T <= 100 
2. 1 <= N <= 1 000 
3. -100 000 <= Ai <= 100 000 
 

Output

For each test case, output the case number first, then the smallest absolute value of sum.
 

Sample Input

221 -141 2 1 -2
 

Sample Output

Case 1: 0Case 2: 1

 


题解:

把每一个数dp值赋初值为当前的值,每次向后加一位,最后选取最小值。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define inf  9999999using namespace std;int dp[1005][1005];int e[1005];int main(){int T,k=0;cin >> T;while(T--){k++;int n;cin >> n;for(int i=1;i<=n;i++){scanf("%d",&e[i]);}    memset(dp,inf,sizeof(dp));    for(int i=1;i<=n;i++){    dp[i][i]=e[i];    }for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){dp[i][j]=dp[i][j-1]+e[j];}}int mixn=99999999;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){if(mixn>abs(dp[i][j]))mixn=abs(dp[i][j]);}}printf("Case %d: %d\n",k,mixn);}return 0;}


0 0