傻逼错误天天犯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 }