1、http://acm.hdu.edu.cn/showproblem.php?pid=1087
2、题目大意:
有一种游戏,人可以从一个棋子的位置走向另一个棋子的位置,每个棋子都有一个权值,可以一步跳过多个棋子,但是必须保证每个棋子的权值都比前边的权值大,且不能走回头路
开始按照LIS做的,一直wrong,看了网上的代码才过的
3、
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15792 Accepted Submission(s): 6714
3 1 3 2 4 1 2 3 4 4 3 3 2 1 0
4 10 3
4、ac代码:
#include<stdio.h> #define N 1005 int a[N]; int dp[N]; int main() { int n; while(scanf("%d",&n)) { if(n==0) break; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=a[i]; } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { if(a[i]>a[j]&&a[i]+dp[j]>dp[i]) dp[i]=dp[j]+a[i]; } } int maxx=-1; for(int i=1;i<=n;i++) { if(dp[i]>maxx) maxx=dp[i]; } printf("%d\n",maxx); } return 0; }
2、wrong 的代码,待改正:
#include<stdio.h> #include<string.h> #define N 1005 long long stack[N]; long long dp[N]; int a[N]; int b[N]; long long maxx; void LIS(int n) { int top=0; long long sum=0; memset(stack,0,sizeof(stack)); stack[top]=-1; maxx=-1; for(int i=1;i<=n;i++) { if(a[i]>stack[top]) { stack[++top]=a[i]; dp[i]=top; } else { int l=1,r=top; while(l<=r) { int mid=(l+r)>>1; if(a[i]<stack[mid]) r=mid-1; else l=mid+1; } stack[r]=a[i]; dp[i]=r; //printf("l=%d\n",r); } sum=0; for(int j=1;j<=dp[i];j++) { sum+=stack[j]; } if(sum>maxx) { memset(b,0,sizeof(b)); for(int j=1;j<=dp[i];j++) { b[j]=stack[j]; } maxx=sum; }//printf("%d\n",maxx); } } int main() { int n; while(scanf("%d",&n)) { if(n==0) break; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } LIS(n); printf("%lld\n",maxx); } return 0; } /* 3 1 3 2 4 1 2 3 4 4 3 3 2 1 0 */