题目: 对于第n张牌,它的最大得分的bing的位置来源于两种情况:
1 上一张(得分只能递增) 2 相同值得最近位置 (可再次加分)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int last[N],dp[N];
int main()
{
int n,num;
while( cin>>n )
{
if ( !n ) break;
memset( last,0,sizeof last );
memset( dp,0,sizeof dp );
for ( int i=1; i<=n; i++ ) {
scanf("%d",&num);
if ( !last[num] ) dp[i] = dp[i-1];
else dp[i] = max( dp[last[num]] + ( num==999? 3:1 ) , dp[i-1] ) ;
last[num] = i;
}
cout<<dp[n]<<endl;
}
return 0 ;
}

本文介绍了一种通过动态规划算法来解决牌堆得分问题的方法。该算法考虑了两种得分情况:一是从上一张牌继续得分;二是从相同值的最近位置牌开始得分,并可能额外加分。通过使用数组记录每种牌的最后位置和累计得分,实现了高效的计算。
297

被折叠的 条评论
为什么被折叠?



