HDU5218 Game

这次bestcoder杯完全被吊打,只解出两题水题。。一直在纠结gal那题暴力wa的问题。。
先把自己负责领域的题补上吧,先这题,dp

====================================================
题意:给出m个数字,类似约瑟夫问题那样,开始有n个人,初始位置是1,每轮随机在m个数字里选一个数字,让对应位置的人出局(如选1的时候,就当前位置那个人出局,每次出局后位置变为出局位置的下一位)。
思路:
令 dp[i][j] 代表剩下i个人时,若当前位置是0(为了计算方便从0开始),那么位置为j的人是否可能获胜。
枚举随机到数字,对于数字(求余当前人数,计算出出局的位置)比j大,比j小(与j相同则不可)分情况计算出出局后j的新位置(类似约瑟夫问题,重新编号)。

#include 
#include
#include
#include
using namespace std;
int arr[300];
int n,m;
int dp[300][300];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;iscanf("%d",&arr[i]);
        memset(dp,0,sizeof(dp));
        dp[1][0]=1;

        for(int i=2;i<=n;i++)
        {
            for(int j=0;jfor(int k=0;kif((arr[k]-1)%i==j)continue;
                    if((arr[k]-1)%i1][j-(arr[k]-1)%i-1];
                    if((arr[k]-1)%i>j)dp[i][j]=dp[i-1][i-1-((arr[k]-1)%i-j)];
                    if(dp[i][j])break;
                }
            }
        }
        int ok=1,ans=0;
        for(int i=0;iif(dp[n][i])ans++;
        printf("%d\n",ans);
        for(int i=0;iif(dp[n][i])
            {
                if(ok)ok=0;
                else printf(" ");
                printf("%d",i+1);
            }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(DP,ACM,hdu,算法-动态规划)