傻逼错误天天犯QAQ

  第一题:简单DP,f[i][j]表示第 i 道题选 j 的最大得分,可以从f[i-1][j-1],f[i-1][j],f[i-1][j+1]转移过来,其实是可以滚动数组优化空间的,不过懒得弄了=。=反正能过

 1 //TYVJ A
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 using namespace std;
12 
13 int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
16     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
17     return v*sign;
18 }
19 typedef long long LL;
20 const int N=500010,INF=~0u>>2;
21 /*******************template********************/
22 int n,a[N],c[N],f[N][6];
23 int main(){
24 #ifndef ONLINE_JUDGE
25     freopen("input.txt","r",stdin);
26 //    freopen("output.txt","w",stdout);
27 #endif
28     n=getint();
29     char s[3];
30     F(i,1,n){
31         scanf("%s",s);
32         a[i]=s[0]-'A'+1;
33         c[i]=getint();
34     }
35     F(i,1,n) F(j,1,4){
36         f[i][j]=max(f[i-1][j-1],max(f[i-1][j],f[i-1][j+1]))+
37             (j==a[i]?c[i]:0);
38     }
39     int ans=0;
40     F(j,1,4) ans=max(f[n][j],ans);
41     printf("%d\n",ans);
42     return 0;
43 }
View Code

相关文章: